我的C#

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_henry_love/article/details/80689099
1.C# 中的set get 的简易写法:
public string name
{
set;
get;


}
这样就表示string这个属性是可读可写的, 如果去掉get就是只写, 去掉set就是只读. 虽然是public 的, 这一点跟JAVA有一点不一样


2. C# 中的decimal 也是一个既可以存小数也可以存整数的格式, 存的取值范围比double小, 但是精度比double高 , 可以精确到28_29位小数. 可以double强转成decimal. decimal 跟Java中的bigdecimal 是不一样的, Java中的bigDecimal 实际上存的还是整数型.  C# 中的decimal在写的时候后面要加一个m, 大小写均可,用来表示这是一个decimal数
3. C# 中数值的计算好像跟Java 是没什么区别的, 整数型在计算的时候都会提升为int, 然后赋值的时候, 就要考虑是否强转了, 
4. C# 中有字符串格式化的方法, 例如对一个double数, 格式化只保留2位小数有以下几种方法, double a = 0.134124; a.tostring("f2"); a.tostring("0.00"); 或者是string.format("{0:0.00}",a);{0} 表示挖坑,后面的
0.00 表示就是这个数字是一个0.00 的两位小数形式. Console.WriteLine() 也有类似的操作, 不过估计也就是底层调用了string.format. 然后再 输出, 不过C# 不是开源 , 所以不知道咯, 
5. C#中可以很快速的进行IO 读写, 直接用File 的静态方法就可以了, File.WriteAllText() 和File.ReadAllText(),  一样的在写的时候, 如果是已经存在的就会先清空这个文件里面的东东,  这一点还是不错的
6, string.format("{0}{1}", obj1,obj2); 这个就是挖坑填坑的方式.第一个参数会填充{0} 其实这个很容易实现的, 
7. C# 中的@ 符号, 有两个作用, 一个是放在字符串前, 表示当前字符串取消\ 转义符的功能. 这样的话, 在书写路径的时候就不用写\\了.

8. \b表示的是删除前一个字符, 但是这个放在字符串的最前面和最后面是没有作用的, 还有就是在IO流中这个也是没有意义的, 

1, C# 中使用Convert.ToInt 之类的方法来做类型转换, 类似于Java中的Integer.valueOf. 但是同时还可以使用int.parse 这样来转换, 所以转换的方法很多
2, C# 中的++ 和Java中一样的, 也是放在后面表示先运算再自增, 放在前面表示先自增再参与运算, 多个++ 一起的话, 就是参与完运算之后就会自增, 然后参与下个运算, 例如int a =10;
int b = ++a+a++; 答案是b=22; 因为第一条语句++a 后a就是11了, 然后再加11 等于22, 最后a再自增变成12
3. C#中的一元运算符的优先度高于二元运算符. 例如++ 高于*. 这个跟Java 也是一样的. 其实也可以理解为, 代码的运算都是从左到右, 但是会把优先度高的算完后再参与计算.
4. C#中逻辑与的优先程度是大于逻辑或的. 跟Java中也是一样的, 现在证实了一点就是说Java或者C# 都是这样, 遇到优先级高的运算, 会把优先级高的运算先执行完, 再去执行其他运算, 但是总体是从左往右的
5. C#中的try catch  跟Java中有点不一样, C# 中的catch 可以不捕获任何异常, 直接try{}catch{}, 但是Java中catch后面是必须跟一个异常类
6. c# 中的循环不可以做标记, 选择跳出哪个循环, jAVA可以
7. VS 调试很简单, 就是F11 开始逐步调试, 然后按F11 又变成下一句, 一直这样就好了. 按下F11后打开调试, 监视, 可以写下要监视的变量 , 也可以是一个表达式例如a+b.
8. C# VS 的断点调试, 先下一个断点, 然后直接点击运行就可以了, 然后就会在这一点停下来, 然后再按F11 往下执行, 感觉比Eclipse的好用一些呀. 要监视的话还是一样的, 在断点之后, 调出监视, 写上要监视的变量.
其实直接把鼠标放在对应的变量上都会显示这个时候这个变量的值
9. VS 中写for循环很简单的, 只要写一个for然后按两下tab键就可以了. 就会出现for循环
10. C#中无论是File或者Directory 或者是FileInfo, DirectoryInfo 都没有直接的isFile或者是IsDirectory 的方法, 但是可以通过FileInfo.Attributes==FileAttributes.Directory 来判断是否是文件夹或者是文件.
 这一点跟Java 是有区别的, 还有就是C# 的方法中对于两个路径,如果是名字一样大小写不一样也是当成同一个的, 因为在windows 中不存在这样的两个路径, 因为是重复的, 
11. C# 中tostring("0.00") 以及String.format("{0:0.00}",double); 这样做转换的时候实际上都已经做了四舍五入了, 不是简单的保留几位小数而已.;
12. C# 中Stack.peek(). 如果此时栈内已经没有值了则会抛出异常, 于是乎可以通过是否抛出异常来判断是否还有值. 也可以通过stack.count来做判断, 如果是0 表示没有值了
13. C# 中复制文件的类有很多, File.Copy, FileStream.CopyTo() 都可以做这件事情
14. C# 中FileStream是操作字节的, StreamReader 和StreamWriter 是用来操作字符的, 一般用于文本文件,
15. StreamWriter 创建的时候可以指定是否是追加. FileStream 也有这个参数, FileMode.Append. 如果不是追加的话, 写的时候就会先清空原来的文件内容
16. 对抽象方法或者是虚方法的重写或者实现都是必须要加一个override的. 抽象类也是用abstract修饰, 抽象方法也是用abstract修饰, 并不是用virtual.实现一个抽象方法也是一样的不可以修改修饰符
17. C# 中的接口也是可以有属性的. 但是实际上这个也只是一个set get方法而已, 子类在实现这个接口的时候, 也还是必须要实现这个属性的,  也就是说接口只有方法,  Java中也可以有属性, 但是这些都变成了常量.
18. C# 中的静态类只能有静态的属性和方法,Java中没有静态类.
19. C# 中不能创建对象的只有静态类,抽象类, 接口
20. C# 中接口里面只能有属性,方法, 索引器和事件
21. 跟Java中一样, C# 中抽象类可以继承类, 但是接口不可以继承类. 类同时继承类并实现接口的时候 必须把接口写在后面, 类写在最前面
22. C# 中抽象类在实现接口的时候必须实现接口中的方法, 跟Java不一样, Java中抽象类在实现接口的时候, 可以不用实现任何方法. 反正最终实例化的是子类. 这可能跟C# 中接口里面的方法是特殊的有关. C# 中接口中的方法在被子类实现的时候, 不需要加override, 这一点跟虚方法和抽象方法都不一样
23. C# 中 一个类可以显示的实现接口的方法, 用这种写法, void Father.Show(){}; 这个方法就跟接口一样默认就是public的, 如果直接public void Show(){} 的话, 这个也是实现接口, 但是如果有显示实现接口的话, 那这个就不是实现接口的方法了, 而只是一个普通的方法了.
24. C# 中一个类中如果一个属性是直接显示初始化的时候, 那么这个显示初始化会在整个外部对象的初始化之前. 其实就是把属性的显示初始化放在了整个外部对象的初始化构造方法的最前面.
25. C# 中 num.tostring("X") 可以把一个数字转成16进制; tostring("X2") 就是表示转换最后的16进制数的结果最少是2位数, 不足的话第一位补0.
26. C# 中可以选择显式的实现接口的方法或者是隐式的实现接口. 隐式实现 interface Man{ void Love()} . class Henry:Man{ public void Love(){}}. 显式实现例如 class Henry:Man{void Man.Love(){}}. 对于前面这个来说如果父接口里面只有一个这样的方法, 是可以的, 但是如果是实现了两个不同的接口但是都有这个方法的时候,  就只能采用显式的实现了,这个时候这个方法必须是不加修饰词的, 也就是说在创建子类对象
真正调用这个实现的方法的时候需要转为父类接口引用, 再调用方法, 这样才可以确定是调用哪个父类接口的方法,  对于隐式的实现接口方法的时候, 是可以直接调用的, 而且必须是public 的.
27. 实现抽象类的抽象方法的时候也是必须要加override 的, 唯一一个重写但是不能写override 的就是重写接口的方法, 
28. 声明一个event可以相当于将后面的这个委托方法变成一个集合一样可以通过+= 或者-= 进行注册或者注销, 但是不能直接在外部类中进行调用发生事件, 只能在声明这事件的类中进行调用 发生的方法.
29. C#中判断两个对象是否是同一个地址值用的是object.referenceequals(object a, object b); 这一点跟Java 是不一样的
30. C# 中被readonly修饰的变量不能重新指向新的地址, 但是可以修改所指向的地址内部的值. 这一点倒是跟Java中的final有一点像, 但是readonly 修饰的变量的初始化必须是在显示初始化或者是构造函数中. 不可以在外部赋值.
31. Java 跟C# 有点在Clone上面都是相似的, Java中都是继承Clonable, C# 是继承ICloneable. 默认的浅拷贝实现Java中使Object的clone方法, C# 中是Object的MemberwiswCopy方法. 浅拷贝指的是目标对象的地址值不一样, 但对象的各个值类型字段相等, 引用类型一致. 也就是说引用的同一个对象, 深拷贝就是把引用类型的字段也变成拷贝, 这样就是深拷贝 , 也就是说两个对象的地址不一样, 但是属性, 字段完全一样, 而且互相不影响.
32. Java中的成员变量显示初始化, 可以引用在他前面定义的成员变量, 或者是静态变量, 在C# 中不可以. C# 中的显示初始化的变量都会构造中赋值.例如 类中有属性 如下public int age =10; 那么这个age=10 会出现在每一个构造函数中. 有理由相信,. Java中应该也是一样的. 而且成员属性显示初始化的代码在构造函数中是位于开头的地方, 也就是说比构造函数中其他手动编写的代码要优先.

猜你喜欢

转载自blog.csdn.net/mr_henry_love/article/details/80689099