【问题标题】:Attribute on struct default constructorstruct 默认构造函数上的属性
【发布时间】:2018-11-03 13:38:16
【问题描述】:

由于结构不能有明确的用户定义的无参数构造函数,例如

public struct MyStruct
{
    public MyStruct() { … } // Not allowed!
}

我想知道是否以及如何将属性应用于该确切的构造函数。 最后,我想要做的是(最好是如果无参数构造函数可以是私有的,但这也是不允许的):

public struct MyStruct
{
    [Obsolete("Do not call the constructor directly, use MyStruct.Get() instead.")]
    public MyStruct() { … }

    public static MyStruct Get
    {
      // Important initializing here.
    }
}

是否有类似这个虚构的属性目标[constructor: Obsolete()] 允许将属性应用于默认构造函数?

编辑:更多信息。

情况是这样的:我需要使用MyStruct 进行P/Invoke 并且不能使用类。我想警告用户他们不应该获得MyStruct 的实例,因为它错过了重要的初始化,他们应该改用工厂方法。

【问题讨论】:

  • 如果你想要那种级别的控制,那么你可能不得不使用类而不是结构。
  • @DavidG 你是对的,如果它可以是一个类,那就太简单了。但是,由于它将用于 P/Invoke,因此它需要是一个结构体。
  • 有点像XY problem,如果你能添加一些关于你的问题以及你为什么要这样做的更多细节,那就太好了。
  • 它并不能真正解决所有问题,因为 struct 可以在不调用构造函数的情况下初始化为默认状态。如果该状态对您来说是不可接受的 - 您必须手动验证(过时的构造函数不会捕获所有问题案例)。
  • 您可以为 P/Invoke 使用一个类 - 是什么让您认为您不能?无论哪种方式,它都会被编组器编组。除非它是嵌入在另一个结构中的结构。

标签: c# struct attributes default-constructor


【解决方案1】:

由于 struct 是一个 ValueType,就其性质而言你找不到任何方法

即使你实例化了一个结构体,它也会被实例化。

int x = new int(); 等价于int x;

MyStruct s = new MyStruct(); 等价于MyStruct s;

假设您可以找到一种方法来警告MyStruct s = new MyStruct();。任何对MyStruct s; 的定义也会被警告!那就没办法了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2020-10-15
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多