C# 3.0:自动属性 ​​- 编译器创建的私有变量的名称是什么

2023-11-21

我在检查.NET 3.5的新特性,发现在C# 3.0中,我们可以使用

public class Person 
{    
 public string FirstName  { get; set; }
 public string LastName  { get; set; }
}

代替

private string name;

public string Name
{
  get { return name; }
  set { name = value; }
}

如果我使用自动属性,Name 的私有变量名称是什么?互联网上的教程说编译器会自动创建一个私有变量。那么如果我想在此类的方法中使用它,我该如何使用/访问私有变量呢?


重写得更清楚

该字段已正常生成,但它作为常规字段对您的代码不可见。

这是典型的自动属性:

public string FirstName  { get; set; }

如果我们查看编译后的程序集,会生成以下后备存储字段:

[CompilerGenerated]
private string <FirstName>k__BackingField;

请注意其中的 ,它们不是您可以在自己的字段名称中使用的字符。您也无法访问该字段,因为当编译器查看您的代码时,它并不“存在”。

对我来说,真正的问题是why您想要访问该字段。换句话说,为什么您需要访问该字段,以及它对您的代码有什么作用,而访问该属性则不会?

如果您想阻止外部对该字段进行写访问,可以通过将 setter 方法设置为私有来轻松实现,如下所示:

public string FirstName  { get; private set; }

请注意,由于该字段实际上存在于程序集中,这意味着这不是 JITter 魔法,而是编译器魔法,因此您可以使用反射来查找和访问该字段。

但话又说回来,你为什么要这么做?

现在,我们假设您确实有合理的理由想要使用该字段而不是属性。我可以想到一个,尽管我可能会采取不同的做法,那就是您希望将字段名称作为 out 或 ref 参数传递给方法,如下所示:

public void AdjustName(ref String name)
{
    name = Capitalize(name);
}

您无法将属性作为 out/ref-parameters 传递,因此此代码将不起作用:

AdjustName(ref string FirstName);

在这种情况下,您需要退回到定义属性的“旧”方式,手动添加后备存储字段,如下所示:

private string firstName;
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}

完成此操作后,您可以调用该方法:

AdjustName(ref string firstName); // note the field, not the property

但是,我可能会更改该方法以返回新值,而不是直接调整引用的变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 3.0:自动属性 ​​- 编译器创建的私有变量的名称是什么 的相关文章

  • C# 中的自动属性是什么?它们的用途是什么?

    有人可以对 C 中的自动属性及其用途提供一个非常简单的解释吗 也许还可以提供一些示例 请尽量用通俗易懂的语言来表达 拜托 当属性访问器中不需要附加逻辑时 将使用自动属性 该声明看起来像这样 public int SomeProperty g
  • 从文件名中提取日期

    我遇到一种情况 我需要从文件名中提取日期 其一般模式是 filename YYYYMMDD fileExtension e g xxx 20100326 xls or x2v 20100326 csv 下面的程序完成了这项工作 Number
  • .NET - 如何创建一个类,使得只有一个其他特定类可以实例化它?

    我想要进行以下设置 class Descriptor public string Name get private set public IList
  • 自定义 Linq 订购

    我有一千多个文件夹 每个文件夹都包含一个或多个具有以下名称的文件 无序 Alison ext Heather ext Molly ext Paula ext Sam ext Ordered Molly ext Sam ext Heather
  • 绘制我自己的标题栏

    我正在我的 WinForm 应用程序中绘制标题栏的一部分 工作正常 将公司名称置于居中并以橙色显示 这是在表单代码中执行此操作的代码 using System Runtime InteropServices DllImport user32
  • Linq to NHibernate 与 ICriteria

    我通常经常使用 LINQ 尤其是 LINQ to Objects 因此我对 LINQ 相当熟练 我正在考虑使用 LINQ to NHibernate 作为我的 NHibernate 项目的查询语言 当我编写一些测试时 我注意到 LINQ t
  • 如何在 IIS 环境中以编程方式注册 WCF 服务

    假设我们有 2 个具有以下布局的项目 Project web global asax 我想到了这个注册目的地 例如void Application Start System Object sender System EventArgs e
  • 确定事件处理程序的优先级

    我有以下代码 我处理一个事件两次 但我总是想确保mynewclass始终首先处理事件 然后触发本地事件处理程序代码 我知道 MyClass 事件应该首先触发 因为这是第一个创建的事件 但由于线程和排队正在发生 我认为它花费了太长时间并且它在
  • 按对象类型进行 LINQ 选择

    我有一个包含两种类型的对象 A 和 B 的集合 Class Base Class A Base Class B Base List collection new List collection Add new A collection Ad
  • 静态只读字段初始值设定项与静态构造函数初始化

    以下是初始化静态只读字段的两种不同方法 这两种方法有区别吗 如果是 什么时候应该优先选择其中一个 class A private static readonly string connectionString WebConfiguratio
  • ~1 秒 TcpListener Pending()/AcceptTcpClient() 延迟

    大概只要看这个视频就可以了 http screencast com t OWE1OWVkO http screencast com t OWE1OWVkO如您所见 启动连接 通过 telnet 或 firefox 和我的程序首先收到消息之间
  • 在C#3.0中是否有更好的方法来编写这行C#代码?

    我有一个财产声明如下 public decimal MyProperty get set 我需要将此值作为字符串传递给另一个方法 因此我认为这样做的唯一方法如下 MyProperty null null MyProperty ToStrin
  • 什么任务最适合以函数式编程风格完成?

    我最近刚刚发现了函数式编程风格 我相信它将减少开发工作 使代码更易于阅读 使软件更易于维护 然而 问题是我很难说服任何人 嗯 最近我有机会就如何减少软件开发和维护工作进行演讲 我想向他们介绍函数式编程的概念以及它如何使团队受益 我的想法是向
  • 如何在WPF中根据bool属性设置背景颜色

    我想设置 GridViewColumn 的背景颜色 该 GridViewColumn 在 WPF 中的列表视图内部进行数据绑定 我不知道如何问这个问题 因为我对 WPF 相当陌生 否则我不会打扰你们所有人 我想根据数据绑定对象中的布尔标志更
  • C# Lambda 表达式:为什么应该使用它们?

    我很快读完了微软 Lambda 表达式 http msdn microsoft com en us library bb397687 aspx文档 不过 这种例子帮助我更好地理解 delegate int del int i del myD
  • 深入学习 C# 表达式树的最佳资源是什么?

    当我第一次输入这个问题时 我这样做是为了找到重复的问题 我确信一定有人已经问过这个问题 我的计划是关注那些重复的链接 而不是发布这个问题 但据我所知 这个问题以前没有被问过 它没有出现在 相关问题 列表中 您找到了哪些用于深入了解 C 表达
  • 在这段 C# 代码中,我的方法后面的符号“=>”在做什么?

    我最近在这里问了一个问题 有人提供了这样的答案 private void button1 Click object sender EventArgs e var client new WebClient Uri X new Uri http
  • 如何解决 AutoMapper 错误? (堆栈溢出异常!)

    我在用自动映射器 http automapper codeplex com EF 实体 gt POCO 用于以下类 public class Category public int CategoryID get set public str
  • 如何在没有设置器的情况下设置属性值

    我已经看到提出并回答了各种问题 我们可以使用反射来调用私有设置器 如下所示 是否可以通过反射获取属性的私有设置器 https stackoverflow com questions 9219261 is it possible to get
  • 使用私有自动属性而不是简单变量来实现编程标准

    在与同行的讨论中 有人提出我们应该考虑对所有类级别变量使用自动属性 包括私有变量 因此 除了这样的公共财产之外 public int MyProperty1 get set 我们的私有类级变量如下所示 private int MyPrope

随机推荐

  • 在 C# 中将对象数组转换为 XML

    我知道没有内置转换器可以将对象数组转换为 XML 是否有一种快速基本的方法可以从数组中创建 XML 以帮助我在这个 XML 和我拥有的另一个 XML 之间进行 LINQ to XML 联接 您可以使用 Linq to XML 将现有数据结构
  • array.find 不适用于 Babel

    我正在使用 Babel 转译我的 ES2015 代码 然而它并没有翻译find对于数组 以下行引发错误TypeError options find is not a function let options 2 23 4 options f
  • 通过 PHP 加载图像

    我正在尝试通过 PHP 加载图像 但我不知道如何 文件名存储在数据库中 例如image jpg if GET image Client requesting image so retrieve it from DB id mysql rea
  • 如何让 gcc 跳过错误,但仍然输出它们。

    是否可以强制 gcc 报告错误 但继续编译它们 本质上 我试图在 c 文件中生成错误列表 但 gcc 总是在出现第一个错误时终止 我已经在谷歌上搜索了一段时间 据我所知 这并不是一个明显需要解决的问题 当 GCC 无法继续前进时 它就会终止
  • NodeJS keydown/keyup 事件

    我有兴趣看看是否可以将功能绑定到用户按下 释放键盘上的按键 到目前为止 我已经能够通过以下方式获取按键事件keypress模块和process stdin的原始模式 var keypress require keypress keypres
  • 错误:应用程序:transformClassesWithDexBuilderForDebug

    我在这个包中有一个 HillfortStore 类 package org wit hillforts models 弄乱了类中的包名称 缺少 s package org wit hillforts model 将类导入到具有错误包名的其他
  • 为什么一些有经验的程序员在变量之前写与值的比较? [复制]

    这个问题在这里已经有答案了 可能的重复 如何检查是否相等 0 i 或 i 0 为什么在 C 中经常看到 null variable 而不是 variable null 我一直在查看一些奇怪的教程以及一些 DirectX 代码 并注意到许多经
  • 如何读取特定文件夹内的所有文件

    我想读取 c net 中特定文件夹内的所有 xml 文件 XDocument doc2 XDocument Load PG SMNR XMLDataSourceUtil GetXMLFilePath Locale Products cate
  • 从 CLOB(包含 XML)中提取特定值,同时为表的每一行创建一个分隔字符串。某些行上的 CLOB 值可能为空

    一些背景 数据库是Oracle 我正在尝试为表的每一行创建一个分隔字符串 分隔字符串的某些值必须来自 CLOB 包含 XML 某些行上的 CLOB 可能为空 这就是问题所在 例如 我有一个表 Item 其中包含以下行 Item ID Ite
  • 重新安装 Microsoft Visual Studio Asp.net MVC 5 脚手架扩展

    我在 Asp Net MVC 5 和 Visual studio 2013 中遇到脚手架问题 我尝试通过首先卸载扩展 Microsoft Visual Studio Asp net MVC 5 Scaffolding 来重新安装它 但我找不
  • AngularJS 和 Windows 8 路由错误

    我正在尝试使用 Visual Studio 2012 在 Windows 8 1 上使用 AngularJS 创建 HTML5 JS CSS3 应用程序 我目前坚持将参数发送到其他视图 当谷歌搜索时 我看到几个使用的例子 a href li
  • Matplotlib 子图 y 轴刻度与上面的图重叠

    我正在尝试绘制 3 个子图 它们之间没有任何空白 默认 y 轴刻度标签使用显示在 y 轴右上角的刻度 下例中的 1e 8 除了与上面的图重叠的下面两个图之外 这很好 有人知道怎么修这个东西吗 下面是一个小例子 import numpy as
  • Nodejs 7 的异步等待

    我已经安装了nodejs 7 3 0 并且有以下代码 let getContent function url return new pending promise return new Promise resolve reject gt s
  • 允许在录制视频时播放音乐,如 Snapchat ios

    首先我想讨论一下发生在snapchat 在 Snapchat 中 当您开始录制视频且歌曲在后台运行时 它允许在录制视频时继续播放该歌曲 录制视频后您还可以在背景中听到该歌曲 我在用SCR记录器用于使用我的自定义布局录制视频和捕获图像 现在我
  • git:如何将分支的根移回两次提交

    假设我有 A B C D E F master G H new feature branch 现在我意识到实际上提交了 B 和 C 属于新功能 所以我想将它们移动到 新功能分支 换句话说 我希望 新功能分支 从 A 开始 并包含提交 B 和
  • 如何在 C/C++ 中处理 unicode 字符序列?

    在 C 和 C 中处理 unicode 字符序列的更便携和简洁的方法是什么 此外 如何 读取unicode字符串 将 unicode 字符串转换为 ASCII 以节省一些字节 如果用户仅输入 ASCII 打印unicode字符串 我也应该使
  • 如何同时从列表中删除多个索引? [复制]

    这个问题在这里已经有答案了 假设我这里有这个列表 list a b c d e f g 我如何删除说索引2 3 4 and 5同时 pop 不接受多个值 我还能怎么做呢 您需要在循环中执行此操作 没有内置操作可以一次删除多个索引 您的示例实
  • 如何在android中实现onMenuItemClickListener

    我如何实施onMenuItemClickListener Override public boolean onCreateOptionsMenu Menu menu super onCreateOptionsMenu menu getMen
  • 如何创建重复的日历事件?

    我正在使用 asp mvc 3 jquery full calendar ms sql server 2008 和 c 我想知道是否有人知道如何制作重复事件 我不确定如何制作它们 例如 在谷歌日历中 您可以每年重复一次约会 我怀疑他们在数据
  • C# 3.0:自动属性 ​​- 编译器创建的私有变量的名称是什么

    我在检查 NET 3 5的新特性 发现在C 3 0中 我们可以使用 public class Person public string FirstName get set public string LastName get set 代替