变量值分配和检索
Variable value assign and retrieve
变量分配(设置)和检索值如何在后台工作?例如:
{
int myValue;
myValue = 5; //here we assign value (set)
Console.WriteLine(myValue); // here we retrieve value
}
所以这里我们先声明价值。在下一行中,我们分配值(它的工作方式是否与设置 属性 相同)。另外,在检索值时,它的工作方式是否与属性中的获取方式相同。
下一题:
如果我们有 TextBox 控件,其中有 Text 属性。
比方说,文本框控件的名称是 myTextBox
.
myTextBox.Text = "Michael"; // here we set value
string result = myTextBox.Text; // here we retrieve (get) value
这与字段属性中的 { get; set; }
方法一样吗?
如果您设置了一个变量,则对应于该变量的内存将填充您分配给该变量的值。如果您使用 {get; set;}
,那么您正在使用所谓的 autosetter/getter。编译器会自动插入一个私有值。例如,如果您有
public int myVariable {get; set;}
编译器会这样:
private int _myVariale;
public int myVariable{
get {return _myVariale;}
set {_myVariale = value;}
}
所以属性的概念是建立在变量之上的。您可以看到 C# 属性及其 get
和 set
语法也作为 API 糖。在其他编程语言中,您将实现 int GetMyVariable()
和 void SetMyVariable(int value)
等函数来实现属性。
如果你愿意,你可以看看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
如果你问的是这个,那没什么特别的。
拥有属性的意义在于避免拥有 public 个变量,并使您能够封装(阅读隐藏)您的实现。
因此,使用 属性,您可以在 setter 中更改它、应用验证逻辑、更改其他变量等(您不应该,顺便说一句),或者更好的是,将来,如果您需要更改支持变量类型,您可以在不破坏 public 接口的情况下进行。
变量分配(设置)和检索值如何在后台工作?例如:
{
int myValue;
myValue = 5; //here we assign value (set)
Console.WriteLine(myValue); // here we retrieve value
}
所以这里我们先声明价值。在下一行中,我们分配值(它的工作方式是否与设置 属性 相同)。另外,在检索值时,它的工作方式是否与属性中的获取方式相同。
下一题:
如果我们有 TextBox 控件,其中有 Text 属性。
比方说,文本框控件的名称是 myTextBox
.
myTextBox.Text = "Michael"; // here we set value
string result = myTextBox.Text; // here we retrieve (get) value
这与字段属性中的 { get; set; }
方法一样吗?
如果您设置了一个变量,则对应于该变量的内存将填充您分配给该变量的值。如果您使用 {get; set;}
,那么您正在使用所谓的 autosetter/getter。编译器会自动插入一个私有值。例如,如果您有
public int myVariable {get; set;}
编译器会这样:
private int _myVariale;
public int myVariable{
get {return _myVariale;}
set {_myVariale = value;}
}
所以属性的概念是建立在变量之上的。您可以看到 C# 属性及其 get
和 set
语法也作为 API 糖。在其他编程语言中,您将实现 int GetMyVariable()
和 void SetMyVariable(int value)
等函数来实现属性。
如果你愿意,你可以看看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
如果你问的是这个,那没什么特别的。
拥有属性的意义在于避免拥有 public 个变量,并使您能够封装(阅读隐藏)您的实现。
因此,使用 属性,您可以在 setter 中更改它、应用验证逻辑、更改其他变量等(您不应该,顺便说一句),或者更好的是,将来,如果您需要更改支持变量类型,您可以在不破坏 public 接口的情况下进行。