C# 无需实例化即可访问类中的属性

C# 无需实例化即可访问类中的属性,c#,class,C#,Class,假设我有一门课: public class foo { public string bar { get { return "A Value"; } } } 如果我只想访问bar中包含的值,而我对实际的类不感兴趣,我可以做如下操作: string value = new foo().bar; 这真的是获取价值的最佳方式吗?我不想使这个属性(和类)是静态的 如果我有很多想要访问的带有bar属性的类,有没有更通用的方法呢 编辑:它不是静态的原因是它是一个

假设我有一门课:

public class foo
{

    public string bar 
    {
        get { return "A Value"; }
    }
}
如果我只想访问bar中包含的值,而我对实际的类不感兴趣,我可以做如下操作:

string value = new foo().bar;
这真的是获取价值的最佳方式吗?我不想使这个属性(和类)是静态的

如果我有很多想要访问的带有bar属性的类,有没有更通用的方法呢

编辑:它不是静态的原因是它是一个被重写的属性,我认为它不能是静态的:

public class parent
{
    public abstract string bar { get; }
}

public class foo : parent
{
    public override string bar
    {
        get { return "A Value"; }
    }
}

您需要使用
static
,它允许无实例的方法和属性:

public class foo
{
    public static string bar 
    {
        get { return "A Value"; }
    }
}

据我所知,没有其他方法(除了常量,而且在某种意义上是有限的)可以使用无瞬变成员。

基于您的示例,我假设该值是常量,因此您可以使用
常量(大致相同但更明确)而不是使用
静态属性:

并通过以下方式访问:

string value = Foo.Bar;
…但这取决于你想用这个变量做什么-所以也许你可以详细说明一下

在任何情况下,有时静态变量都有其用途,但不要过度使用。我个人总是尽量避免静态(特别是静态操作),原因有很多,例如,请参见中的static facade

还要注意,公共属性和类名应该遵循Pascal表示法,因此它应该是
Bar
Foo


另一种选择是注入一个提供值的提供者组件。依赖项注入容器负责这一点,您可以在应用程序启动时为其指定正确的生存期。然后可以轻松地替换默认实现(例如,从配置文件获取值)。同样,这一切都取决于您想使用这个值走多远,以及这个“值”有多复杂,如果它只是一个字符串,请保持简单:)

您对静态类有什么看法?或者实际上,在常规非静态类中有一个
static
属性class@ShellShock可测试性,依赖注入不友好等@ShellShock查看更新的问题可能重复
公共类foo()
我只是想知道:为什么类声明末尾的圆括号?@Lloyd
const
s是
静态的
(它们的工作方式与之类似,并在IL中编译成那样),它们只是在编写时没有使用
static
关键字。@TimS不完全正确,您只能使用值类型IIRC?Static允许您在这方面有更多的灵活性(尽管您也可以使用readonly)。@Lloyd true,我不是说
const
Static
是一回事;只是如果某个东西是
const
,它也是
static
,尽管它不使用
static
关键字。@TimS。啊,好的,这是有道理的。注意,只有当值简单且固定时,这才有效,如本例所示;如果您确实需要运行代码来确定它,那么它应该仍然是一个属性。这就是为什么我添加了“但这取决于你想用这个变量做什么”。如果这个问题得到了回答,也许我们可以详细说明:)
string value = Foo.Bar;