c#语法(unity)

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值