【问题标题】:Accessing property in class without instantiation在没有实例化的情况下访问类中的属性
【发布时间】:2013-06-10 20:30:27
【问题描述】:

假设我有一堂课:

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"; }
    }
}

【问题讨论】:

标签: c# class


【解决方案1】:

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

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

据我所知,没有其他方式(除了 consts,这在某种意义上是有限的)拥有即时成员。

【讨论】:

  • public class foo() 我只是想知道:为什么类声明末尾的圆括号?
  • @Lloyd consts 是 static(它们的工作方式类似并在 IL 中编译为),它们只是在没有 static 关键字的情况下编写的。
  • @TimS 不完全是,您只能使用值类型 IIRC?静态允许您在这方面有更多的灵活性(尽管您也可以使用只读)。
  • @Lloyd 是的,我不是说conststatic 是一回事;只是如果某个东西是const,它也是static,虽然它不使用static 关键字。
  • @TimS。啊,好吧,这是有道理的。
【解决方案2】:

根据您的示例,我假设该值是一个常量,因此您可以使用const(大致相同但更明确)而不是使用static 属性:

public class Foo
{
    public const string Bar = "A value";
}

并通过以下方式访问它:

string value = Foo.Bar;

...但这取决于你想用这个变量做什么 - 所以也许你可以详细说明一下。

无论如何,有时静态变量有其用途,但不要过度使用。出于多种原因,我个人总是尽量避免使用静态(尤其是静态操作),例如,请参阅 this post 中的静态外观。

还请注意,公共属性和类名应遵循 Pascal 表示法,因此应为 BarFoo

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

【讨论】:

  • 请注意,这仅在值简单且固定的情况下才有效,如本例所示;如果您确实需要运行代码来确定它,它应该仍然是一个属性。
  • 确实如此。这就是为什么我添加了“但这取决于你想用这个变量做什么。”。如果这个问题得到了回答,也许我们可以详细说明:)
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多