Heim >Backend-Entwicklung >C#.Net-Tutorial >Lösen Sie das Problem der Übergabe eines C#-Arrays als Parameter

Lösen Sie das Problem der Übergabe eines C#-Arrays als Parameter

黄舟
黄舟Original
2017-09-19 11:28:212300Durchsuche

Grundsatz: Kontrollieren Sie die Änderung von Daten so weit wie möglich. Wenn vorhergesagt werden kann, dass bestimmte Daten nicht geändert werden oder nicht geändert werden sollten, sollten Sie dies kontrollieren und nicht erwarten, dass der Anrufer, der diese Daten verwendet, dies tut seinen Wert nicht ändern.

Wenn die Parameter während der Verwendung versehentlich geändert werden, treten unvorhersehbare Ergebnisse auf, und diese Art von Fehler ist schwer zu erkennen. Daher müssen wir sie beim Entwerfen von Methodenparametern vollständig berücksichtigen. Mögliche Folgen der Übergabe des Referenztyps Parameter oder die Übergabe von Referenztypparametern per Referenz.

Wenn ein Datenelement während des Übertragungsprozesses nicht geändert werden kann, darf der Wert (Feld oder Attribut) beim Erstellen des Objekts nicht geändert werden.

1. Steuerung einfacher Parameter

1. Übergabe von Werttypparametern

In diesem Fall das übergebene It ist eine Kopie des Parameters, hat keinen Einfluss auf den Originalwert und erfordert keine Kontrolle.

2. Übergeben von Referenztypparametern

a. Eine Datenstruktur bestehend aus Werttypen

muss das Feld festlegen Auf „Schreibgeschützt“ werden nur Eigenschaften abgerufen. Die Zuweisung kann nur über den Konstruktor erfolgen.

b. Datenstruktur mit Referenztypfeldern

Diese Situation ist rekursiv und die Attribute müssen gleichzeitig abgerufen werden , die Referenztypfelder sind Nutzungstypen, die diese Anforderung ebenfalls erfüllen.


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. Kontrolle der Übergabe komplexer Referenztypparameter

Die sogenannte Komplexität bedeutet, dass der Parameter ein ist Array- oder Sammlungstyp oder die Parameter enthalten diese Datentypen. In diesem Fall kann die obige Methode nicht garantieren, dass die Parameterdaten nicht geändert werden, da die Array- oder Sammlungsfelder (Eigenschaften) selbst dann nicht geändert werden, wenn das Objekt schreibgeschützt ist. im Objekt kann noch geändert werden.

1. Sammlungsparameter (dasselbe gilt für Referenzparameter, die Sammlungsfelder enthalten)

.net-Versionen vor 4.5 können Schnittstellen verwenden, die keine Methoden zum Ändern von Sammlungselementen enthalten anstelle eines bestimmten Sammlungstyps. Verwenden Sie beispielsweise die IEnumerable8742468051c85b06f0a0af9e3e506b5c-Schnittstelle anstelle von List8742468051c85b06f0a0af9e3e506b5c. Version 4.5 kann direkt die IReadOnlyCollection-Schnittstelle oder einen Sammlungstyp verwenden, der diese Schnittstelle implementiert.

2. Array-Parameter

Es gibt keine gute Möglichkeit, Array-Typ-Parameter vor Änderungen zu schützen. Vermeiden Sie daher die Verwendung von Array-Typen als Methodenparameter, es sei denn, es handelt sich um optionale Parameter verwendet, wenn.

3. Um die oben genannten Dinge zu verstehen, müssen Sie den Unterschied zwischen den Konzepten

1 unterscheiden

2. Der Unterschied zwischen der Übergabe von Referenztypparametern und der Übergabe von Referenztypparametern (ref und out)

3 [Das ist am verwirrendsten]

Der Unterschied besteht darin, dass beim Erstellen eines neuen Objekts für die Referenz während der Verwendung dieses Parameters ersteres keinen Einfluss auf den ursprünglichen Wert hat, während letzteres den ursprünglichen Wert beeinflusst. Beispiel:


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}

Denken Sie an ein Prinzip:

Werttypen übergeben eine Kopie des Werts und Referenztypen übergeben ein Objekt Referenzen, daher wirken sich Änderungen an Wertparametern nicht auf den ursprünglichen Wert aus. Die durch den Wert übergebenen Änderungen wirken sich nicht auf den ursprünglichen Wert aus, und die Referenzübergabe (ref und out) wirkt sich auf den ursprünglichen Wert aus.

Das obige ist der detaillierte Inhalt vonLösen Sie das Problem der Übergabe eines C#-Arrays als Parameter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn