文章目录
1. sealed
- public sealed class SealedClass
修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override(C# 参考)一起使用。
2. set,get的方法
-
java中通常是
class A { private int a; //可以通过setter/getter生成下面代码。 public int a_get() { return this.a; } public void a_set(int a) { this.a=a; }
-
c#中与java有些不同,他简化了
class A{ private int a; Public int a{ get { return a}; set {a=value} } }
3. internal
- internal访问修饰符表示 访问仅限于当前程序集
只有在同一个程序集的文件中,内部类型或者是成员才可以访问。这是msdn上对internal的描述。只有这么一句话,但是具体怎么理解呢?类型就是enum(枚举类型),class(类),interface(接口),struct(结构)等类型。类型成员如函数,成员变量等。那么什么是程序集呢?根据msdn上通俗易懂的解释就是,一个完整的.exe或者是.dll文件就是一个程序集,一般伴随着exe程序集产生的还有一个程序集清单,.exe.config文件。下面我就用一个例子来说明“internal关键字是类型和类型成员的访问修饰符。只有在同一个程序集的文件中,内部类型或者是成员才可以访问”。
4. C#高级参数
4.1、ref out
- 两者都是按地址传递,使用后都将改变原来参数的数值。
out
-
用于在方法中返回多余值。(可以理解为让一个方法返回不同的类型值)
public void mysub(int[] arr,out int max,out int min) { //如果需要返回多个参数,则添加多个参数即可,例如login(string name, string pwd, out string msg,out int num) //out多余返回值,用于一个方法中多余返回的值,例如这个方法中 //out的参数必须在方法中进行初始化 //这里处理数据,假定最大值最小值已经放到了m和n里 max=m; min=n; } //调用 int i,j; int[] myarr;//(这假定是你的数组) mysub(myar,out i,out j); //最大即为i,最小为j
可能遇到的报错 :
- 问题1:对out类型进行了初始化,但是IDE提示未赋值
赋值位置:
报错提示:
原因分析:
针对于for()循环这个代码块,程序是不一定会进入的,所以IDE会判定未赋值。
解决:
在循环外部进行out参数初始化赋值
ref
(1)、使用ref关键字的注意点:
i、方法定义和调用方法都必须显式使用 ref 关键字
ii、传递到 ref 参数的参数必须初始化,否则程序会报错
iii、通过ref的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题
ref VS out(参数对比)
-
当你在使用ref传递参数的时候,ref修饰的参数必须要有值,但是out可以使用一个未赋值的变量作为参数传递。下面我也用代码做了验证
private void FindFromTail(List<Vector3> CutEdge, ref List<bool> visit, int head, ref int tail, ref List<Vector3> points, ref List<int> outline, ref int visitTime) { int n = CutEdge.Count / 2; List<Vector3> points1 = new List<Vector3>(n); List<int> outline1 = new List<int>(n * 2); int temp = points.Count; //if (visit[i] == true) // continue; for (int j = 0; j < n; j++) { if (visit[j] == false && CutEdge[2 * tail + 1] == CutEdge[2 * j]) { visit[j] = true; tail = j; outline1.Add(points1.Count + n); outline1.Add(points1.Count + 1 + n); points1.Add(CutEdge[j * 2]); points1.Add(CutEdge[j * 2 + 1]); visitTime++; Debug.Log("1"); } } //Debug.Log("1"); points.AddRange(points1); outline.AddRange(outline1); }
-
即:当需要对传入参数做修改且其有初始值,选取ref;需要修改传入参数,而其无初始值选用out
4.2、where
Where是泛型约束, 限制参数的范围。
例如:Instantiate<>初始化函数
public static T Instantiate<T>(T original) where T : Object;
LookAt()方法
Transform.LookAt()方法
public void LookAt (Transform target);
旋转当前脚本对象,让向前向量z指向target的当前位置。简单说,旋转物体使z轴指向目标物体。
注意
1、这里改变的是自身的旋转角度,且使得当前对象的自身(Local)z坐标对着 target对象的(Pivot)具体坐标
2、当target对象物体包含多个子物体时,看的是当前对象具体的坐标,也就是Pivot的坐标,而不是中心坐标Center