有没有办法使用自动属性显式实现接口?例如,考虑以下代码:
namespace AutoProperties
{
interface IMyInterface
{
bool MyBoolOnlyGet { get; }
}
class MyClass : IMyInterface
{
static void Main(){}
public bool MyBoolOnlyGet { get; private set; } // line 1
//bool IMyInterface.MyBoolOnlyGet { get; private set; } // line 2
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译.但是,如果将第1行替换为第2行,则无法编译.
(这不是我需要让第2行工作 - 我只是好奇.)
有没有办法将合同放在.NET中自动实现的属性上?(如果答案是'是'怎么办?)?
(我假设使用DevLabs的.NET代码合同)
在项目中定义新类时,这样做的正确/最佳实践是什么?在过去,我创建了以下类:
public class MyClass
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
通常我会使用这样的类来创建项目中的集合.
然而,随着我继续学习和阅读有关c#sharp的更多内容,我看到了将类定义为的示例:
class MyClass //not set to public
{
private string _firstName; //first defined as fields
private string _lastName;
public string FirstName // then defined as properties
{
get { return _firstName; }
set { _firstName = value; }
}
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
第一种方法在定义上是否不正确,或者这是C#中可接受的速记版本?作为最佳实践,您应该首先使用私有字段定义类,然后使用get/set为值将它们定义为属性?
我问,因为我在C#自学,我正在努力改进,以及更好地理解正确的开发方法,一些样本和教程只是简单地陈述方法没有一个可靠的解释为什么一种方法是首选(或应该是完成)另一个.
提前致谢
在与同行的讨论中,我们提出应该考虑对所有类级变量使用自动属性...包括私有变量.
所以除了像这样的公共财产:
public int MyProperty1 { get; set; }
Run Code Online (Sandbox Code Playgroud)
我们的私有类级变量如下所示:
private int MyProperty2 { get; set; }
Run Code Online (Sandbox Code Playgroud)
代替:
private int _myProperty2;
Run Code Online (Sandbox Code Playgroud)
关于为什么有人想要这样做但我无法决定我是否愿意接受这一点是因为我自己内部洗脑以及如何将我的代码写入相同的编程标准和命名惯例使用了10年,或者因为我以前从未见过这种情况(因为某种原因).
我知道这是额外的代码输入,但说实话,在使用自动属性时,由于'prop'和'propg'片段,我认为我没有输入它所以它设置起来非常简单一个新的代码片段来创建一个私有的自动属性,所以额外的代码不会打扰我太多,因为我从来没有打字.
除了美学可能只是我的潜意识,使用完全私人汽车属性可能会导致任何问题吗?这样做有没有充分的理由呢?我今天在stackoverflow,codeplex,codeproject等上看到了很多代码,我从未见过有人使用过这个标准....有什么原因吗?
我在设置某些属性时遵循一个模式,我检查相应的字段是否为空,如果没有则返回该字段,如果是,则设置它.例如,我经常使用它来读取配置设置,以便懒惰地读取设置,以便只读取一次.这是一个例子:
private string DatabaseId
{
get
{
if (string.IsNullOrEmpty(databaseId))
{
databaseId = CloudConfigurationManager.GetSetting("database");
}
return databaseId;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经开始使用C#6 autoproperty初始化,因为它真正清理并使我的代码更简洁.我想做这样的事情:
private string DatabaseId { get; } = CloudConfigurationManager.GetSetting("database");
Run Code Online (Sandbox Code Playgroud)
但我不确定编译器在这种情况下如何解释它.这是否与我的第一个代码块具有相同的效果,设置(自动实现)字段一次,然后从字段中读取?或者CloudConfigurationManager每次我都会打电话给我DatabaseId?
我今天遇到了这个问题,并且能够确定在进行代码清理时,R#不会将属性从支持字段转换为使用SerializableAttribute修饰的类中的自动属性,例如
using System;
namespace DataContracts
{
[Serializable]
public class Class1
{
private bool _wontChange;
public bool WontChange
{
get { return _wontChange; }
set { _wontChange = value; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
在自动代码清理期间,不会更改上述代码.当然,我可以手动执行此操作,我仍然可以从R#获取快速操作菜单选项,以便在单个属性级别执行此操作.但它让我想知道在[Serializable]类中使用自动属性是否存在我不知道的潜在问题.
在JetBrains论坛帖子中,我们提到了一个讨论这个问题的问题,但似乎没有明确解决.
我知道在使用自动属性时,编译器会在屏幕后面创建自己的支持字段.但是,在我读过的许多程序中,我看到人们明确地写了
private int _backingField;
public int Property { get { return _backingField; } }
Run Code Online (Sandbox Code Playgroud)
上面和下面有什么区别?
public int Property { get; private set; }
Run Code Online (Sandbox Code Playgroud)
我明白当你在getter或setter中实际存在副作用时使用该属性是显而易见的,但通常情况并非如此.此外,我知道您必须在结构的情况下明确使用支持字段,您不能通过属性访问其成员.
我能找到的唯一区别是调用值的方式在它定义的类中是不同的.那么它是简单的首选项,还是通过其属性调用值或直接访问领域?简单约定?
我需要创建和管理许多简单的已发布属性.如果他们看起来像我那么称他们为自动属性:
private
FTitle: string;
published
property Title: string read FTitle write FTitle;
Run Code Online (Sandbox Code Playgroud)
通常我会在下一步创建它们:
添加属性名称和类型:
property Title: string
选择属性名称并将其复制Title到剪贴板.
附加行 read F Ctrl+V write F Ctrl+V ;
有没有办法排除步骤2和3以更快地添加属性?也许有可能为此创建一些宏?
我试图通过从头开始构建现有但简单的应用程序来学习Roslyn,这似乎是一种有效的方法来学习它.无论如何,我有以下代码:
var root = (CompilationUnitSyntax)document.GetSyntaxRoot();
// Add the namespace
var namespaceAnnotation = new SyntaxAnnotation();
root = root.WithMembers(
Syntax.NamespaceDeclaration(
Syntax.ParseName("ACO"))
.NormalizeWhitespace()
.WithAdditionalAnnotations(namespaceAnnotation));
document = document.UpdateSyntaxRoot(root);
// Add a class to the newly created namespace, and update the document
var namespaceNode = (NamespaceDeclarationSyntax)root
.GetAnnotatedNodesAndTokens(namespaceAnnotation)
.Single()
.AsNode();
var classAnnotation = new SyntaxAnnotation();
var baseTypeName = Syntax.ParseTypeName("System.Windows.Forms.Form");
SyntaxTokenList syntaxTokenList = new SyntaxTokenList()
{
Syntax.Token(SyntaxKind.PublicKeyword)
};
var newNamespaceNode = namespaceNode
.WithMembers(
Syntax.List<MemberDeclarationSyntax>(
Syntax.ClassDeclaration("MainForm")
.WithAdditionalAnnotations(classAnnotation)
.AddBaseListTypes(baseTypeName)
.WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword))));
root = root.ReplaceNode(namespaceNode, newNamespaceNode).NormalizeWhitespace();
document = document.UpdateSyntaxRoot(root);
var attributes …Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
class Foo
{
bool Property
{
get;
set
{
notifySomethingOfTheChange();
// What should I put here to set the value?
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在那里设置价值吗?或者我是否必须明确定义get并向该类添加另一个字段?