zoukankan      html  css  js  c++  java
  • c#与java对比

    1.c#一个类只能继承一个类,继承语法:

    class Dog : Anilmal{
    
    }

    2.c#中的sealed关键字相当于java中的final关键字,定义的类不能被继承,如:string类不能被继承

    3.c#中protected表示继承类可以访问,外部无法访问

    4.c#中的base关键字相当于java中的super关键字

    5.c#中的构造函数

    class A{
      public A(){}
      public A(string a):this(){}//表示调用上面的无参构造,this就表示调用本类的方法
      public A(int a):this("123"){}      //表示调用上面的string参数类型的构造
    }
    

    6.c#中对象的多态性,如果父类Animal中有一个方法public void shout(){...},子类Dog中也有一个方法,这时候你想使用Animal animal=new Dog(),采用animal调用Dog类中的shout方法,就需要改代码了,改成以下形式(各加一个关键字)

    Animal类中的shout方法改成以下代码:
    public virtual void shout(){...}
    
    Dog类中的shout方法改成以下代码:
    public override void shout(){...}//即覆写掉父类的属性或方法
    //如果Dog还有子类,想继续覆写就不用再在Dog类中的方法加virtual关键字了,直接使用override就行了
    如:Dog类中还有一个子类Dog1,覆写Dog中的shout方法
    直接在Dog1中加下一代吗即可:
    public override void shout(){...}

    7.c#中的抽象类:和java一样使用abstract关键字,如:

    public abstract class  Animal{
    	public abstract void shout();//抽象方法也要使用abstract关键字,抽象类不能直接实例化,需要子类继承并且子类必须覆写抽象类的抽象方法(即在方法返回值前面加上override关键字,此时就不需要在抽象方法前面加上virtual关键字了)
    }
    注意:抽象类中也可以写普通方法

    8.c#中set,get方法的写法

    public 返回值类型 属性名称{get;set;}
    如下代码:
    public string name{get;set;}
    

    9.c#中的接口采用interface关键字

    如下代码:
    interface IFly{
       public void Fly();//这里的public可以省略,因为接口中的方法或属性只能是public权限 
    } 
    

      如果A类继承B类,并且实现C接口,则代码如下:

    class A:B,C{
    
    }
    

    10.c#类是单继承,接口可以多继承一个类可以继承多个接口,抽象类可以继承接口,接口不能继承抽象类。

     11.struct值类型,用来定义结构体,如下代码:

    class Program{
    	struct Location//结构体
    	{
    		public int X;
    		public int Y;
    
    		public Location(int x,int y){this.X=x;this.Y=y}//此处不允许定义无参构造
    	}
    	static void Test(Location loc){
    		loc.X=1;
    		loc.Y=1;
    	}
    	static void main(string[] args){
    		Location loc=new Location(0,0);
    		Test(loc);
    	}
    }
    

    12.try{...} catch(Exception e){...}finally{...}快捷键,先打出来try再连续按两次Tab建即可,如果异常此处处理不了也可以抛出来catch{throw;}

    13.c#的泛型:

    //1
    static T Sum<T>(List<T> nums) where T:struct//这里的where是对泛型的约束,struct表示数值型 { T sum =default(T);//表示给sum赋初值(即数值型默认的值) return sum; }
    //2
    class Test{
      public void X();
    }
    static void TestFunc<T>() where T:Test,new(){//如果这里不加new(),下面不能使用new T();如果这里
    不加Test约束,下面不能调用Test类
      T t=new T();
    t.X();

    }

    14.c#中重载操作符(赋值符号不能重载):如下代码重载

    public static bool operator ==(Location lhs,Locations rhs){
    	return false;
    }
    

    15.VS

      •  VS结构:一个解决方案底下可以添加多个项目,可以认为一个项目对应一个命名空间

      •  VS中创建类库,将鼠标光标放在"解决方案"上右键选择"新建",然后选择"类库",类库编译之后生成的就是dll文件。

      •  VS中引用类库,两种引用方法:

        • 引入整个dll文件

          在需要引用的项目的目录中有一个引用,将光标放在"引用"上面右键,选择添加引用,选择你要选择的即可(如果选择自定义的,就要选择"解决方案"下的"项目"再进行查找)

        • [DllImport(...)],仅用于方法

    16.IDisposable接口结合using的使用

    //1.IDisposable是一个自动释放资源的接口,里面有一个Dispose方法
    //在读写流或者需要使用close()关闭的地方使用using()结合此接口使用
    static void Main(string args[]){
    	using(StreamWriter sq=new StreamWriter(new FileStream("777.txt",FileMode.Create,FileAccess.Write))){
    		sq.WriteLine("123");
    	}
    }//此时在执行using的时候,在using语句执行完毕之前会自动执行IDisposable接口的Dispose方法从而自动释放资源
    

    17.委托(引入委托也叫作匿名方法)

    class Program
    {
    	//1.声明委托类型
    	delegate bool Function(int num);
    	static Function BigThan10=delegate(int n){//此处的n与上面的num一一对应
          return n>=10;
          }; //2.修改形参列表 static List<int> Traverse(List<int> nums,Function function){ var list=new List<int>(); foreach(var num int nums){ if(function(num)){ list.Add(num); } } return list; } //3.传入委托 static void Main(string[] args){ Traverse(new List<int>(){1,2,3,4,5},BigThan10);//传入委托 Console.WriteLine(); Console.ReadLine(); } }

    18.委托写法的化简——Lambda表达式

      1.语句Lambda

    //语法:(type var,...)=>{...}//加类型
    	(var,...)=>{...}//不加类型
    	var=>{...}//一个参数的时候
    	()=>{...}//没有参数的时候
    //17中的第三部传入委托也可以也成
    Traverse(new List<int>(){1,2,3,4,5},delegate(int n){return n>=10;});//显然这样写有点啰嗦,
    使用Lambda表达式可以简化成:
    (1)  Traverse(new List<int>(){1,2,3,4,5},(int n)=>{return n>=10;});
    (2)  Traverse(new List<int>(){1,2,3,4,5},(n)=>{return n>=10;});
    (3)如果只有一个参数括号也不用写了:Traverse(new List<int>(){1,2,3,4,5},n=>{return n>=10;});

      2.表达式Lambda:没有{},但是只能有一条语句

    Traverse(new List<int>(){1,2,3,4,5},n=> n>=10);//将return也去掉
    

    19.系统自带的泛型委托

    (1)Action<> 例:List<T>.ForEach()
    (2)Func<> 例List<T>.Sum()
    (3)Predicate<> 例 List<T>.FindAll()
           例 List<T>.Find()
    

     (1)的代码:

    var list=new List<int>(){1,2,3,4,5,6};
    list.Foreach(i=>{Console.WriteLine(i)});//这里的i表示list集合中的一个个值
    

     (2)的代码:

    class Program
    {
    //1.声明委托类型
    static Func<int, bool> BigThan10 = delegate(int n)
    {
    return n>=4;
    };

    //2.修改形参列表
    static List<int> Traverse(List<int> nums, Func<int, bool> function){
    var list=new List<int>();

    foreach(var num in nums){
    if(function(num)){
    list.Add(num);
    }
    }
    return list;
    }
    //3.传入委托
    static void Main(string[] args)
    {
    var list=new List<int>(){1,2,3,4,5,6};
    var n=Traverse(list, BigThan10);
    n.ForEach(i=>Console.WriteLine(i));
    Console.ReadLine();

    }
    }

     (3)的代码

    20.c#中的foreach是只读的,不能给其赋值。

    21.c#中的Dictionary相当于java中的map,实例化直接使用Dictionary,

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/wxl123/p/11445916.html
Copyright © 2011-2022 走看看