知识点。
throw 和throw ex的区别
https://blog.csdn.net/zunguitiancheng/article/details/9006703
从上面的的调用中可以看出来,throw 能够指定到具体的存在问题的代码位置,而throw ex 不能,你只能知道在这个 try,catch中存在逻辑或者调用出现了问题。
Uint :无符号类型,不能是负数的值。
ViewState:https://www.cnblogs.com/yintian2/archive/2007/07/25/831287.html
dynamic (动态类型):https://www.cnblogs.com/qianxingdewoniu/p/5595828.html
C# 访问修饰符区别:https://blog.csdn.net/weixin_43267344/article/details/100924565
IL:中间语言
IDE: 集成开发环境
例如:vs2010,vs2012
C#、.NET Framework、CLR的关系:https://blog.csdn.net/lidandan2016/article/details/77868043
const: 原文链接:https://blog.csdn.net/yiyelanxin/java/article/details/72461257
一、const关键字限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。
1.用于修改字段或局部变量的声明,表示指定的字段或局部变量的值是常数,不能被修改。
2.常数声明的类型指定声明引入的成员类型。常数表达式必须产生具有目标类型或可隐式转换为目标类型的值。
3.常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取值来初始化常量。
(如果const int a = b + 1; b是一个变量,显然不能在编译时就计算出结果,所以常量是不可以用变量来初始化的。)
4.常数声明可以声明多个常数。
public const double x = 1.0, y = 2.0, z = 3.0;
5.不允许在常数声明中使用static修饰符。
6.常数可以参与常数表达式。如:
public const int c1 = 5; public const int c2 = c1 + 100;
二、readonly允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
1.readonly是在计算时执行的,所以它可以用某些常量初始化。
2.readonly是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。
三、const(静态常量)与readonly(动态常量)区别
1.const字段只能在该字段的声明中初始化;
readonly字段可以在声明或构造函数中初始化,因此,根据所使用的构造函数,readonly字段可能具有不同的值。
2.const字段是编译时常量,而readonly字段可用于运行时常量。
public static readonly uint a1 = (uint)datetime.now.ticks;
3.const默认就是静态的,而readonly如果设置成静态的就必须显示声明。
4.const对于引用类型的常数,可能的值只能是string和null。readonly可以是任何类型。
运算符 ^
有面试过一个console.writeLin(7^ 2)的 没有答对,琢磨之后
7的二进制是 0111
2的二进制是 0010
根据 ^ 是指按位异或
1和1为0
1和0为1
0和0为0
所以得出来的应该是 0101 为5
out (输出传递参数)和ref(引用传递参数) 的区别就是在于
ref 传递变量之前(变量必须初始化)要是个已经赋值的参数,out可以不需要
ref 传递之后在方法体内可以选择性重新赋值,out 必须要赋值
int a = 10; int b = 20; Console.WriteLine(valuetype.GetValue(ref a, ref b)); valuetype.GetValues(out a, out b); Console.WriteLine("{0},{1}", a, b);
params (参数数组)用法补充:
- 1.带 params 关键字的参数类型必须是一维数组,不能使用在多维数组上;
- 2.不允许和 ref、out 同时使用;
- 3.带 params 关键字的参数必须是最后一个参数,并且在方法声明中只允许一个 params 关键字。
- 4.不能仅使用 params 来使用重载方法。
- 5.没有 params 关键字的方法的优先级高于带有params关键字的方法的优先级
案例
ParamArray param = new ParamArray(); Console.WriteLine(param.AddElements(12, 23, 34)); class ParamArray { public int AddElements(params int[] arr) { int sum = 0; foreach (int i in arr) { sum += i; } return sum; } }
结构体
定义
struct Books { public string title; public string author; public string subject; public int book_id; };
调用
Books books; books.author = "作者"; Console.WriteLine(books.author); //会报错,不New时,字段要被赋值 Console.WriteLine(books.book_Id);
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
- 与类不同,结构不能继承其他的结构或类。
- 结构不能作为其他结构或类的基础结构。
- 结构可实现一个或多个接口。
- 结构成员不能指定为 abstract(抽象)、virtual (虚方法)或 protected(保护访问,只限于本类和子类访问,实例不能访问)。
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
类 vs 结构
类和结构有以下几个基本的不同点:
- 类是引用类型,结构是值类型。
- 结构不支持继承。
- 结构不能声明默认的构造函数。
构造函数
定义
class ParamArray { public string Name { get; set; } public ParamArray() { this.Name = "zhang"; } }
调用时:这里我并没有对Name 重新赋值,运行后还是输出 "zhang",说明它是在 对象创建时执行,它没有任何返回类型。
ParamArray param=new ParamArray(); Console.WriteLine(param.Name);
析构函数,在名字前加 ~,析构函数是在程序结束时执行,一般时候析构函数里面写的都是一些资源回收之类的东西.
class ParamArray { ~ParamArray() { this.Name = "sss"; } }
静态类,就是指类前面加(static)关键字
static class ParamArray { }
1:静态类不能包含析构函数
2:静态类中定义构造函数不能加访问修饰符,比如public,private
3:静态类中定义的方法,属性必须是静态方法
public static string GetElements(string str) { return str = "hollow"; }
C# 方法默认访问级别 : private
C# 类默认访问级别 : internal