草庐IT

c# - 属性和自动实现

coder 2024-06-02 原文

我在 Outlook 2013 的 VSTO 插件中使用 .NET 4.5。我在完全掌握属性和访问器方面遇到了一些麻烦。自动实现的访问器,我假设是在你只写 get 的时候;放;而不是 get {//code } 等也给我带来了麻烦。我有一本我在类里面内部使用的字典。这是我的代码:

private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }

然后:

clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();

我稍后在同一类中使用与代码中的属性相同的名称。

我从来没有写过:

private Dictionary<string, string> _clientDict; // etc.

创建变量我只是直接使用属性。

我尝试更改我的代码来执行此操作,但我遇到了一些问题并意识到我对属性的理解有点困惑。

这里有几个我需要澄清的问题,但我似乎找不到正确的答案。

首先,有没有理由使用私有(private)属性(property)?我的字典永远不会在类之外或任何派生类中访问,所以有理由使用属性吗?我不使用任何特殊验证或 setter 中的任何东西或类似的东西。

其次,当我尝试更改我的代码以使用变量,然后像典型的属性示例那样通过属性访问它们时,我遇到了问题。我找到了一个例子,其中 getter 被设置为 return _clientDict,但 setter 只是 set; 它给了我一个错误:我必须给 set 一个主体,因为它不是抽象的或局部的。为什么在这种情况下它不为我自动实现 setter ?

最后,当我在声明它的同一个类中的属性上调用 new 时,对属性和同一类型的普通变量执行此操作有什么区别?在那种情况下,属性与变量有什么不同吗?当应该使用私有(private)变量完成时,以这种方式使用属性是否是一种不好的做法?

这些可能是一些被误导的问题,但我找不到任何其他地方有信息来帮助我理解这些区别。我一直在尝试使用属性来尝试解决所有这些问题,但我需要一些帮助。

最佳答案

First, is there any reason to use a private property?

通常不会。属性非常适合封装。使用属性的一个优点(有 many more )是它可以在赋值之前进行验证。当您有一些私有(private) 时,您通常不需要保护这些东西免受您自己的侵害。此外,属性具有设置不同访问器(privateprotected 等)的优势,而字段则没有。

Why would it not auto-implement the setter for me in this instance?

我们必须明白,自动实现的属性并不是黑魔法。编译器将为我们生成一个私有(private)的支持字段,而不是我们自己提供。从他的角度来看,他看到您有一个返回私有(private)字段的 getter,但 setter 是自动的,这通常会指示您的代码中存在某种逻辑错误。为什么要返回一个值却设置一个完全不同的值?当您创建带有支持字段的属性时,您必须同时提供 getter 和 setter,those are the rules .

when I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type?

在语义上,没有new 属于正在构造的类型,将发出构造函数调用。不同之处在于一旦新创建的对象被分配。字段将导致编译器发出 stfld 操作码。对于一个属性,它将发出一个 call 来调用属性 setter 。当您访问一个属性时,编译器将最终调用 get_YourPropertyName 与字段上的 ldfld

Is it bad practice to use properties this way when it should be accomplished with private variables?

我不会称之为不好的做法,但我会觉得拥有私有(private)属性(property)有点奇怪。

有关字段和属性的更多见解,请参阅 What is the difference between a Field and a Property in C#?

关于c# - 属性和自动实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441404/

有关c# - 属性和自动实现的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  10. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

随机推荐