ホームページ バックエンド開発 C#.Net チュートリアル C# 配列をパラメータとして渡す問題を解決する

C# 配列をパラメータとして渡す問題を解決する

Sep 19, 2017 am 11:28 AM
.net 現れる

原則: 特定のデータが変更されない、または変更されるべきではないと予測できる場合は、そのデータを使用する呼び出し元がその値を変更しないことを期待しないでください。

使用中にパラメータが誤って変更されると、予期しない結果が発生し、このエラーを検出するのが困難です。そのため、メソッドのパラメータを設計するときは、参照型パラメータを渡すことによって起こり得る結果を十分に考慮する必要があります。このようにして。

転送プロセス中にデータの一部を変更できない場合、オブジェクトの構築時に値 (フィールドまたは属性) を変更してはなりません。

1. 単純なパラメータの制御

1. 値型パラメータの受け渡し

この場合、パラメータのコピーが渡されるため、元の値には影響せず、制御は必要ありません。

2. 参照型パラメータの転送

a. 値型で構成されるデータ構造

は、フィールドを読み取り専用に設定し、属性を取得のみに設定する必要があります。代入はコンストラクターを介してのみ実行できます。

b. 参照型フィールドを含むデータ構造

この状況は、フィールドが読み取り専用であり、参照型フィールドで使用される型も満たしていることを確認する必要があります。この要件。


public class SuperClass
{    private readonly int  _no;    private readonly SubClass _tag; 
    public int NO
   {         get{ return _no;}
   }    
    public SubClass Tag
    {         get{ retirn _tag;}
     }      
      public SuperClass(int no,SubClass tag)
      {
            _no=no;
            _tag=tag;   
       }
} 
 
public class SubClass
{     private readonly int _field;     
     public int Field
     {          get{ return _field;}
     } 
     public SubClass(int field)
    {
          _field=field;
     }
}
ログイン後にコピー

2. 複雑な参照型パラメータの転送の制御

いわゆる複雑性とは、パラメータが配列型またはコレクション型であるか、パラメータにこれらのタイプのデータが含まれていることを意味します。オブジェクトが読み取り専用であっても、オブジェクト内の配列またはコレクション フィールド (プロパティ) は変更できるため、上記のメソッドではパラメーター データが変更されないことを保証できません。

1. コレクション パラメーター (コレクション フィールドを含む参照パラメーターにも同じことが当てはまります)

4.5 より前のバージョンでは、特定のコレクション タイプの代わりにコレクション要素を変更するメソッドを含まないインターフェイスを使用できます。たとえば、List の代わりに IEnumerable インターフェイスを使用します。バージョン 4.5 では、IReadOnlyCollection インターフェイスまたはこのインターフェイスを実装するコレクション型を直接使用できます。

2. 配列パラメータ

配列型のパラメータを変更から保護する良い方法はないため、オプションのパラメータが使用されない限り、メソッドのパラメータとして配列型を使用することは避けるようにしてください。

3. 上記のことを理解するには、概念の違いを区別する必要があります

1. 値型と参照型の違い

2. 値転送と参照転送 (ref と out) の違い)

3. 参照型パラメーターの受け渡しと参照 (ref および out) による参照型パラメーターの受け渡しの違い [これが最も混乱します]

違いは、このパラメーターを使用して参照用の新しいオブジェクトを作成する場合です。前者は元の値に影響しませんが、後者は元の値に影響します。例:


void FunA(MyClass a)

{

     a=new MyClass("A");

} 

void FunB(ref MyClass a)

{

     a=new MyClass("B");

} 

void Test()

{

  MyClass a=new MyClass("A");   

      FunA(a);                

      Print(a);              //a还是原始的对象 TEST
 

      FunB(ref a);

       Print(a);               //a变为新对象   B}
ログイン後にコピー

1 つの原則を覚えておいてください:

値型は値のコピーを転送し、参照型は値を転送します。オブジェクト参照であるため、値パラメータの変更は元の値に影響しません。型の参照変更は元の値に影響しません。値によって渡されるパラメータの構築は元の値に影響しません。また、参照の受け渡し (ref および out) は元の値に影響します。価値。

以上がC# 配列をパラメータとして渡す問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語のnullの代替案は何ですか C言語のnullの代替案は何ですか Mar 03, 2025 pm 05:37 PM

この記事では、CのNull Poernter recerferenceの課題を調査します。問題は、問題はnullではなく、その誤用であると主張しています。 記事では、参照前のチェック、ポインターInitialiなど、非参照を防止するためのベストプラクティスの詳細

次のレベルのCコンパイラを追加する方法 次のレベルのCコンパイラを追加する方法 Mar 03, 2025 pm 05:44 PM

この記事では、printf内の\ nエスケープシーケンスを使用してcで新しいライン文字を作成し、関数を置く方法について説明します。 機能を詳しく説明し、出力のラインブレークに使用することを示すコード例を提供します。

どの言語コンパイラが優れていますか? どの言語コンパイラが優れていますか? Mar 03, 2025 pm 05:39 PM

この記事は、Cコンパイラの選択に関する初心者を案内しています。 GCCは、使いやすさ、幅広い可用性、広範なリソースが初心者に最適であるため、最適であると主張しています。 ただし、GCC、Clang、MSVC、およびTCCも比較して、その違いを強調しています

nullは、C言語での最新のプログラミングではまだ重要ですか? nullは、C言語での最新のプログラミングではまだ重要ですか? Mar 03, 2025 pm 05:35 PM

この記事では、現代のCプログラミングにおけるNullの継続的な重要性を強調しています。 進歩にもかかわらず、Nullは明示的なポインター管理にとって重要なままであり、有効なメモリアドレスがないことをマークすることにより、セグメンテーションの障害を防ぎます。 最高のPRAC

C言語コンパイラのWebバージョンは何ですか? C言語コンパイラのWebバージョンは何ですか? Mar 03, 2025 pm 05:42 PM

この記事では、初心者向けのオンラインCコンパイラをレビューし、使いやすさとデバッグ機能に焦点を当てています。 OnlineGDBとRepl.itは、ユーザーフレンドリーなインターフェイスと役立つデバッグツールのために強調表示されます。 プログラムやコンパイルなどのその他のオプション

C言語コンパイラによるコードをコピーする方法 C言語コンパイラによるコードをコピーする方法 Mar 03, 2025 pm 05:43 PM

この記事では、C IDEでの効率的なコードコピーについて説明します。 コピーはコンパイラ機能ではなくIDE機能であり、IDE選択ツールの使用、コード折りたたみ、検索/交換、テンプラなど、効率を向上させるための詳細戦略であることを強調しています。

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 Mar 03, 2025 pm 05:41 PM

この記事では、オンラインCプログラミングプラットフォームを比較し、デバッグツール、IDE機能、標準コンプライアンス、メモリ/実行の制限などの機能の違いを強調しています。 「最良の」プラットフォームはユーザーのニーズに依存していると主張しています。

c言語コンパイラインストールチュートリアル(コンピューターバージョン) c言語コンパイラインストールチュートリアル(コンピューターバージョン) Mar 03, 2025 pm 05:41 PM

このチュートリアルは、Windows、MacOS、LinuxにCコンパイラをインストールすることでユーザーをガイドします。 人気のコンパイラ(MINGW、Visual Studio、XCode、GCC)のインストールを詳述し、環境可変構成を説明し、トラブルシューティング手順を提供します

See all articles