0

VS2010 は、CodeContract.Invariant が false であると私に言い続けます。これがどのように当てはまるのかわかりません

public class BankAccountIdentifierDefinitionVariation_CreateCommandArgs : ValidatedCommandArgs
{
    public string IdentifierCode {get; private set; }
    public string CountryCode {get; private set; }
    public Ems.Infrastructure.Validation.StringValidator Validator {get; private set; }

    private BankAccountIdentifierDefinitionVariation_CreateCommandArgs()
        : base() { }

    public BankAccountIdentifierDefinitionVariation_CreateCommandArgs(
        string identifierCode,
        string countryCode,
        Ems.Infrastructure.Validation.StringValidator validator)
    {
        Contract.Requires(!string.IsNullOrEmpty(identifierCode));
        Contract.Requires(!string.IsNullOrEmpty(countryCode));
        Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode));
        Contract.Ensures(!string.IsNullOrEmpty(this.CountryCode));

        this.IdentifierCode = identifierCode;
        this.CountryCode = countryCode;
    }

    [ContractInvariantMethod]
    void ContractInvariants()
    {
        Contract.Invariant(!string.IsNullOrEmpty(IdentifierCode));
        Contract.Invariant(!string.IsNullOrEmpty(CountryCode));
    }
}

警告は、両方の不変条件が偽であるということです。これは明らかに当てはまりません。次の2つのバリエーションも試しました。

Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode);
if (string.IsNullOrEmpty(identifierCode)) throw new ArgumentNullException...
this.IdentifierCode = identifierCode;

そしてまた

Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode));
this.IdentifierCode = identifierCode;
if (string.IsNullOrEmpty(this.IdentifierCode)) throw new ArgumentNullException...

プライベートセッターを介してプロパティの値を変更できるため、不変式がfalseのように見えます(私は変更しませんが)。これに対処する方法はありますか?シリアル化しているため、プロパティはプロパティのままにする必要があります。

4

2 に答える 2

2

静的アナライザーは、パラメーターなしのコンストラクターが呼び出されないことを確認できないようです。たぶん、その存在はあなたの不変性に疑問を投げかけるのに十分です。

完全に削除できますか?コンストラクターが既にある場合、なぜパラメーターなしのプライベート コンストラクターが必要なのですか?

于 2013-02-13T11:41:46.070 に答える
0

実行すると実際に不変式に違反するため、プライベートデフォルトコンストラクターが警告の原因になると思います。ただし、コンストラクターが定義されているため、デフォルトのコンストラクターの削除を妨げるものは何もありません。少なくとも1つのコンストラクターを定義すると、コンパイラーはデフォルトのコンストラクターを代わりに発行しません。デフォルトのコンストラクターを使用することはないため、そもそもそれを使用する理由はありません

于 2013-02-13T11:47:32.617 に答える