用类和结构说明值传递和引用传递
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。 方法无法访问原始结构中调用方法并不能将其更改任何方式。 该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。 当对方法的 引用类型通过值 ,方法进行引用的复制到类实例。 即方法受到实例,而不是复制实例的地址的副本。 在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。 由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。 但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。 如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
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 方法。
• 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。