Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于Get和Set的快速问题_C#_Get_Set - Fatal编程技术网

C# 关于Get和Set的快速问题

C# 关于Get和Set的快速问题,c#,get,set,C#,Get,Set,如果类中有以下代码,get和set方法是否与该变量关联?如何使用类的实例访问get和set public string Something { get; set; } 这本质上是一个编译器技巧。编译代码时,编译器将生成一个隐藏字段以及在get和set中返回和设置字段所需的代码 您可以像访问任何其他属性一样访问此属性MyClass.Something=“bla”这是一个自动属性,它在编译器中创建一个支持字段,您无需为其编写代码 获取: 设置: 编译器为您创建了一个包含getter和setter方

如果类中有以下代码,get和set方法是否与该变量关联?如何使用类的实例访问get和set

public string Something { get; set; }

这本质上是一个编译器技巧。编译代码时,编译器将生成一个隐藏字段以及在get和set中返回和设置字段所需的代码


您可以像访问任何其他属性一样访问此属性
MyClass.Something=“bla”

这是一个自动属性,它在编译器中创建一个支持字段,您无需为其编写代码

获取:

设置:


编译器为您创建了一个包含getter和setter方法(*)的支持变量,但您在标准代码中看不到它们。您只需直接访问该属性即可

myClass.Something = "blah"; // uses set
string myValue = myClass.Something; // uses get;

*这些方法是为属性创建的,而不是自动实现的。对于自动实现的属性,编译器生成的支持变量将添加到混合中。

这与下面的代码类似,但击键次数要少得多:-)


此语法随.Net Framework 3.5(自动属性)提供

就像:

private string something;
public string Something
{
     get { return something; }
     set { something = value; }
}
要访问此变量(假定位于MyClass类中),请执行以下操作:

  • 这是编译器的一个新特性
  • 这叫做自动属性
  • 您不需要为自动属性定义备份存储,编译器会为您完成这项工作
  • 您不能在自动属性中插入自定义代码,您需要恢复到声明属性的正常1.1样式
  • 可以像访问普通属性一样访问自动属性

  • 编译器将此转换为:

    public string Something { get; set; } 
    
    转化为类似的内容(在IL中,为了方便起见,转换为C):

    此外,编译器会将这些行:

    Something = "test";
    var result = Something;
    
    为此:

    set_Something("test");
    var result = get_Something();
    

    所以你看,下面都是方法调用(就像在Java中一样),但实际上在C#中有属性语法。但是如果您试图直接调用这些方法,您会得到一个。

    不,它被称为自动属性(magic),您不能在不指定{get;set;}的情况下使用此代码吗?我在路上cornfused@Soo:是的,这将定义公共字段,例如
    公共字符串某物。不同之处在于,对于属性,可以(显式地)有支持变量,可以在setter中进行验证,可以对get和set使用不同的访问修饰符(因此,可能外部代码可以获取该值,但只有类本身可以设置该值),或者是上述加上我没有提到的其他内容的组合。首选的方法是通过属性而不是字段公开数据。不要忘记声明您的_Something变量;-)
    
    // GET
        MyClass myObj = new MyClass();
        string test = myObj.Something;
    // SET
        myObj.Something = "blabla";
    
    public string Something { get; set; } 
    
    string _something;
    public string get_Something() { return _something; }
    public void set_Something(string value) { _something = value; } 
    
    Something = "test";
    var result = Something;
    
    set_Something("test");
    var result = get_Something();