ホームページ > バックエンド開発 > C++ > C#Evilの可変構造体は、なぜ不変の代替品を考慮する必要があるのですか?

C#Evilの可変構造体は、なぜ不変の代替品を考慮する必要があるのですか?

DDD
リリース: 2025-02-03 03:31:09
オリジナル
791 人が閲覧しました

Are Mutable Structs in C# Evil, and Why Should You Consider Immutable Alternatives?

c#変動構造トラップ:警告ストーリー

C#プログラミングの分野では、さまざまな構造が物議を醸す位置を占めています。一部の開発者はそれらの使用を提唱していますが、他の開発者はそれらを潜在的な問題の根本原因として強く非難しています。この記事の目的は、変数構造に関する基本的な問題を明確にすることと、悪名高い「邪悪な」名前を取得する理由を目指しています。

値タイプ

を理解します 構造は、元のデータ型(int、doubleなど)と同様に、値型として分類されます。これは、構造が変数への関数または割り当てに渡されると、元の構造のコピーが作成されることを意味します。この動作は、参照タイプ(クラスなど)とは異なります。つまり、参照型変数によって行われた変更は、同じ参照のすべてのインスタンスに影響します。

変動性と副作用

可変構造の定義は、コピーした後でも、フィールドを変更できることです。この属性は、事故や副作用につながり、コードの動作を推測することを困難にする可能性があります。 次の例を考えてみましょう

この例では、構造ポイントは可変であり、そのXフィールドはModifyPoint関数で変更されます。期待される結果は、元のポイント変数Pも更新されることです。ただし、コンソールによって印刷された値は1です。これは、ModifyPointに渡されたコピーが唯一の変更であることを示しています。 (注:元の例コードは間違っています。変更されたコードは、予想される動作を示しています)

一貫性を維持します

<code class="language-csharp">public struct Point
{
    public int X;
    public int Y;
}

public void ModifyPoint(Point point)
{
    point.X++;
}

Point p = new Point { X = 1, Y = 2 };
ModifyPoint(p);

Console.WriteLine(p.X); // 1 (预期输出)</code>
ログイン後にコピー
可変構造は、維持が困難な複数のコピー間で一貫性を作る場合があります。たとえば、複数のスレッドが変数構造に同時にアクセスする状況を検討してください。別のスレッドが変更する前に元の値を訪れた場合、スレッドによって行われた変更は反映されない場合があります。これにより、予測不可能な動作と潜在的なデータ損傷を引き起こす可能性があります。

変更されていない代替可変構造に関連するトラップを回避するために、不可能な変数構造の変更を検討してください。特徴のない構造が作成されると、変更できません。変更後にデータを使用して新しい例を作成することで、変更を完了する必要があります。 この方法により、すべての変更されていない構造のコピーが一貫性のあるままであり、予期しない副作用の可能性を排除することにより、手続き的行動の推論を簡素化します。

結論

可変構造は、不道徳な構造よりも優れたパフォーマンスの利点を提供できますが、その固有の変動性は、プログラムに複雑さと予期しない動作をもたらす可能性があります。可変構造に関連する課題を理解することにより、開発者は賢明な決定を下し、コードの定義と一貫性を維持するときに不可能な変数構造を選択できます。

以上がC#Evilの可変構造体は、なぜ不変の代替品を考慮する必要があるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート