变量值分配和检索

本文关键字:检索 分配 变量值 | 更新日期: 2023-09-27 17:55:49

变量赋值(设置)和检索值如何在后台工作?例如:

{ 
   int myValue;
   myValue = 5; //here we assign value (set)
   Console.WriteLine(myValue); // here we retrieve value
}

所以这里我们首先声明值。在下一行中,我们分配值(它的工作方式是否与设置属性相同)。此外,在检索值时,它的工作方式是否与获取属性相同。

下一个问题:

如果我们有 文本框 控件,它具有 Text 属性。比方说,文本框控件的名称是 myTextBox

myTextBox.Text = "Michael"; // here we set value
string result = myTextBox.Text; // here we retrieve (get) value

这与字段属性中的{ get; set; }方法相同吗?

变量值分配和检索

如果需要,可以查看 IL。下面是使用 linqpad 的简单示例:

void Main()
{
    int i ;
    i=5 ;
    i.Dump();
    i_p = 6;
    i.Dump();
}
// Define other methods and classes here
public int i_p {get; set;}

这是它的 IL:

IL_0000:  nop         
IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     // i
IL_0003:  ldloc.0     // i
IL_0004:  call        LINQPad.Extensions.Dump
IL_0009:  pop         
IL_000A:  ldarg.0     
IL_000B:  ldc.i4.6    
IL_000C:  call        UserQuery.set_i_p
IL_0011:  nop         
IL_0012:  ldloc.0     // i
IL_0013:  call        LINQPad.Extensions.Dump
IL_0018:  pop         
IL_0019:  ret         
get_i_p:
IL_0000:  ldarg.0     
IL_0001:  ldfld       UserQuery.<i_p>k__BackingField
IL_0006:  stloc.0     
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.0     
IL_000A:  ret         
set_i_p:
IL_0000:  ldarg.0     
IL_0001:  ldarg.1     
IL_0002:  stfld       UserQuery.<i_p>k__BackingField
IL_0007:  ret         

那里没有什么太花哨的事情发生,如果这是你要问的。

拥有属性的目的是避免使用公共变量,并使您能够封装(读取隐藏)您的实现。

因此,使用属性,您可以在 setter 中更改它、应用验证逻辑、更改其他变量等(顺便说一句,您不应该这样做),或者更好的是,将来,如果您需要更改支持变量类型,您可以在不破坏公共接口的情况下执行此操作。

如果设置了一个变量,则与该变量对应的内存将填充您分配给该变量的值。如果你使用{get; set;}你就在使用所谓的自动设置器/getter。编译器将自动插入一个私有值。例如,如果您有

public int myVariable {get; set;}

编译器将执行以下操作:

private int _myVariale;
public int myVariable{
    get {return _myVariale;}
    set {_myVariale = value;}
}

因此,属性的概念是建立在变量之上的东西。可以看到 C# 属性及其getset语法,也可以作为 API 糖。在其他编程语言中,您将实现int GetMyVariable()void SetMyVariable(int value)等函数来实现属性。