【问题标题】:Variable value assign and retrieve变量值分配和检索
【发布时间】:2015-06-13 14:09:33
【问题描述】:

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

{ 
   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; } 方法相同?

【问题讨论】:

  • 你应该指定语言。
  • 好吧,对不起,我加了,C#
  • Text 是 TextBox 上的一个属性,是的,分配它并使用 get/set 读取它就像拥有一个变量并设置/获取它一样。我不确定你在问什么

标签: c# variables properties


【解决方案1】:

如果需要,您可以查看 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 中更改它、应用验证逻辑、更改其他变量等(您不应该,顺便说一句),或者更好的是,如果您将来需要更改支持变量类型,您可以在不破坏公共接口的情况下做到这一点。

【讨论】:

  • 是的,这正是我所要求的。我是初学者,在一堂视频教程中,老师说它会降低价值。而且我从来没有听说过术语转储,所以它明显高于他所说的。谢谢
  • 我们通常使用“dump”来表示在控制台上显示,或任何其他输出(日志文件、错误流等)。 Linqpad 有一个Dump() 扩展,让您可以轻松查看您的值。强烈建议你去看看,很棒。
  • Linqpad 是第三方工具吗?看起来很棒...非常感谢。
  • 是的。这是我写的一篇关于它的文章,有链接,以及一些你可能会发现对初学者有用的技巧:) linqpad and visual studio
【解决方案2】:

如果您设置了一个变量,则对应于该变量的内存将被您分配给该变量的值填充。如果您使用{get; set;},您正在使用所谓的autosetter/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) 等函数来实现属性。

【讨论】:

  • 是的,我只是想设置和检索变量值的概念与属性的工作方式(在后台)相同。谢谢
  • 你的变量对应内存中的一个地址。分配一个变量意味着向那块内存写入一个值。将一个变量的值分配给另一个变量意味着将属于第一个变量的内存值复制到另一个变量的内存中。我不确定这是否是您要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多