我有一个名为ItemBase的类,其中有许多类继承。
在这个类中,我有许多单行方法,它只返回一个字符串或对象,并且可用于所有继承类。我在继承的类中使用了这些,以使代码更具可读性,因此我总是只有一个地方定义每个计算或信息。
我像使用PHP和Java一样使用Getters ,因为这是我一直以来的方式:
public class ItemBase
{
protected string GetApplicationPath()
{
return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
}
protected string GetApplicationDataPath()
{
return GetApplicationPath() + @"..\..\..\TestServices\";
}
}
但是,我注意到 Getters和Setter并没有真正用在C#中,因为它们是Java或PHP而且我怀疑有更好,更简洁/标准的方法在C#中这样做。
但是我不想使用类变量,因为在类变量初始化器中定义逻辑似乎不对,我假设即使可能进行某些计算,它也可能是皱眉在某些情况下会导致问题:
protected string _applicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
我在阅读了Jon Skeet's article中关于你的不利之处后,远离公共领域。另外,这只是一个简单定义的代码太多了。
protected string ApplicationPath
{
get
{
return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
}
}
我可以使用C#的缩写属性,但是每一小段信息都有两个地方的代码,名称使用两次,只是看起来不是一个简洁的解决方案。
protected string ApplicationPath { get; set; }
public ItemBase()
{
ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
}
所以我已经确定使用这些Getters就像我在PHP和Java中那样,虽然这似乎不是一种非常C#的方式来实现它。
您在C#中使用哪些约定来存储这些只包含一条信息或进行一些计算的“一行类变量”?
protected string ApplicationPath
{
get { return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); }
}
protected string ApplicationDataPath
{
get { return ApplicationPath + @"..\..\..\TestServices\"; }
}
答案 0 :(得分:3)
“我可以使用C#的缩写属性,但是每个小信息都有两个地方的代码,名称使用两次,只是看起来不是一个简洁的解决方案”
你是什么意思?属性只是通常用Java做的getter / setter方法的语法糖。你在哪里看到两个地方的代码?
public string MyProp
{
get{return "MyProp";}
}
答案 1 :(得分:2)
您在C#中使用哪些约定来存储这些只包含一条信息或进行一些计算的“一行类变量”?
在您的描述之后:使用只读属性。这是 在C#中执行此操作的方式,在大多数情况下,它确实是唯一合理的替代方法。正如你自己说过的那样:
我注意到Getter和Setter并没有真正用在C#中,因为它们是Java或PHP
是的,原因很简单:.NET的属性提供了一种特殊的语法糖来表达getter和setter。在某种程度上,后者只是一种解决方法,以弥补前者的缺席。
某些情况下,您可能不想要使用属性:
保证永远不会改变的编译时常量:对这些使用公共常量(const
):
public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593";
您希望向消费者明确说明操作(可能)耗时和/或没有副作用的情况:使用Get
- 前缀方法。但是,在副作用的情况下,让方法名称也反映出来可能会更好。
答案 2 :(得分:1)
答案与你已经打折的一个选项完全相同,因为代码太多了?除了那些属性名称以Get开头,这根本没有意义..
只有get实现的受保护属性确实是可行的方法。如果有人想知道它应该由编译器内联。