"Публичная структура содержит одно или несколько закрытых полей, которые будут экспортированы" - но нет полей?

У меня есть структура ниже, которая компилируется для COM-взаимодействия. Я получаю следующее предупреждение сборки:

предупреждение: введите обработку предупреждения экспортера библиотеки MyNamespace.MyStruct.k__BackingField, MyAssemblyName. Предупреждение: общедоступная структура содержит одно или несколько закрытых полей, которые будут экспортированы.

Но я не понимаю, о чем идет речь - здесь нет непубличных полей или полей вообще. Может быть, компилятор генерирует что-то, чего я не вижу? Что означает это предупреждение и что я могу сделать, чтобы его очистить?

Вот (слегка очищенный) код, который создается:

[Guid("....")]
[ComVisible(true)]
public struct MyStruct
{
    public string StringA { get; set; }
    public string StringB { get; set; }

    public MyStruct(string a, string b)
    {
        StringA = a;
        StringB = b;
    }

    public MyStruct(MyStruct other)
    {
        StringA = other.StringA;
        StringB = other.StringB;
    }

    public override bool Equals(object obj)
    {
        if (!(obj is MyStruct)) return false;
        var other = (MyStruct)obj;
        return
            other.StringA == this.StringA &&
            other.StringB == this.StringB;
    }

    public static bool operator ==(MyStructa, MyStructb) => a != null && a.Equals(b);
    public static bool operator !=(MyStructa, MyStructb) => !(a == b);
    public override int GetHashCode() => ToString().GetHashCode();

    public override string ToString() => $"{StringA}-{StringB}";
}

и для хорошей меры вот генерируется IDL:

typedef [uuid(....), version(1.0), custom(xxxx, MyNamespace.MyStruct)]
struct tagMyStruct {
    LPSTR <StringA>k__BackingField;
    LPSTR <StringB>k__BackingField;
} MyStruct;

как создано OleView. Я вижу, что он содержит то же самоеk__BackingField как в предупреждении - но не ясно, что это значит.

1 ответ

Вы используете автоматические свойства:

public string StringA { get; set; }

Компилятор автоматически генерирует резервное поле для каждого из них. Это именно то, что

MyNamespace.MyStruct.k__BackingField

имеет в виду.


Вы получаете предупреждение, потому что раскрытие закрытого поля может быть непреднамеренным или может привести к проблемам с безопасностью. Разработчик должен проверить, так ли это. В вашем конкретном примере не будет нарушения инкапсуляции, поэтому можно игнорировать предупреждение или подавить его. См. Также официальную документацию по этому поводу от MSDN:

Когда подавлять предупреждения

Можно безопасно отключить предупреждение из этого правила, если допускается публичное обнажение поля.

Другие вопросы по тегам