扩展方法

用类和结构说明值传递和引用传递
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。 方法无法访问原始结构中调用方法并不能将其更改任何方式。 该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。 当对方法的 引用类型通过值 ,方法进行引用的复制到类实例。 即方法受到实例,而不是复制实例的地址的副本。 在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。 由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。 但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。 如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。

public class test : MonoBehaviour {

    // Use this for initialization
    void Start () {

        TheClass c = new TheClass();
        c.name="class";
        TheStruct s ;
        s.name = "struct";
        ChangeName.ChangeClassName(c);
        ChangeName.ChangeStructName(s);
        Debug.Log("After the Change"+c.name);
        Debug.Log("After the Change" + s.name);
    }

    // Update is called once per frame
    void Update () {

    }

    class TheClass
    {
        public string name;
    }

    struct TheStruct
    {
        public string name;
    }

    class ChangeName
    {
        public static void ChangeClassName(TheClass c)
        {
            c.name = "ChangeClass";
        }

        public static void ChangeStructName(TheStruct s)
        {
            s.name = "ChangeStruct";
        }
    }
}

Var类型
在很多情况下,var 是可选的,它只是提供了语法上的便利。 但是,在使用匿名类型初始化变量时,如果需要在以后访问对象的属性,则必须将该变量声明为 var。 这在 LINQ 查询表达式中很常见。从源代码的角度来说,匿名类型没有名称。 因此,如果已使用 var 初始化查询变量,则只有一种方法可以访问返回的对象序列中的属性,那就是使用 var 作为 foreach 语句中的迭代变量的类型。

public class test : MonoBehaviour {

    // Use this for initialization
    void Start () {

        string[] words = { "hello", "linux ","PYTHON" };

        var upperLowerWords = from w in words select new { upper = w.ToUpper(), lower = w.ToLower() };

        foreach (var ul in upperLowerWords)
        {
            Debug.Log(ul.upper+ ul.lower);
        }
    }

    // Update is called once per frame
    void Update () {

    }


}

定义和调用扩展方法
1. 定义一个静态类以包含扩展方法。该类必须对客户端代码可见将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。
2. 该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。
3. 在调用代码中,添加一条 using 指令以指定包含扩展方法类的命名空间。
4. 按照与调用类型上的实例方法一样的方式调用扩展方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication10
{
    public static class StringExtension
    {
        public static int wordCount(this String str)
        {
            return str.Split(new Char[] { ' ', '.', '!' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

namespace TestExtension
{
    using ConsoleApplication10;
    class Program
    {
        static void Main(string[] args)
        {
            String s = "Hello Linux!";
            Console.WriteLine(s.wordCount().ToString());
            Console.ReadKey();
        }
    }
}

静态构造函数
静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
静态构造函数具有以下特点:
• 静态构造函数既没有访问修饰符,也没有参数。
• 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
• 无法直接调用静态构造函数。
• 在程序中,用户无法控制何时执行静态构造函数。
• 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
• 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
• 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值