Heim >Backend-Entwicklung >C#.Net-Tutorial >C# Advanced Programming (3) – Detaillierte Erläuterung von Objekten und Typen
Der Unterschied zwischen Klassen und Strukturen ist ihre Speichermethode im Speicher , Zugriffsmethoden (ähnlich den auf dem Heap gespeicherten Referenztypen, während Strukturen auf dem Stapel gespeicherte Werttypen sind) und ihre einige Eigenschaften .
Syntaktisch sind Klassen Strukturen sehr ähnlich. Der Hauptunterschied besteht darin, dass Strukturen das Schlüsselwort struct verwenden wird anstelle von Klasse deklariert.
3.3.1 Datenmitglieder
Datenmitglieder enthalten Klassendaten – Felder, Konstanten und Ereignisse Mitglieder von .
3.3.2 FunktionMember
Funktionsmitglieder stellen bestimmte Funktionen für Betriebsdaten in der Klasse bereit, einschließlich Methoden, Eigenschaften, Konstruktoren und Destruktorfunktionen (Terminatoren). ) , Operatoren und Indexer.
Methode
Der Unterschied zwischen ref und out :
ref muss vor dem Bestehen initialisiert worden sein, out ist nicht erforderlich.
Die Essenz von ref besteht darin, den Werttyp als Referenz zu übergeben, während out dient dazu, den Rückgabewert zu erhöhen.
Benannter Parameter: Sie können seinen Namen während der Übergabe des Parameters angeben. Das Format ist Methodenname (Parametername: Wert)
Params Schlüsselwort: muss am Ende der Methodenparameter stehen.
Überladung von Methoden: Es kann keinen Unterschied nur im Rückgabetyp geben, und er kann nicht allein auf der Deklaration basieren ref , Unterscheiden Sie zwischen out oder params .
Attribute
Konzept: Eine Eigenschaft ist eine Methode oder ein Methodenpaar. Aus der Sicht des Client-Codes ist sie ein Feld.
Der Get-Accessor akzeptiert keine Parameter und gibt den von der Eigenschaft deklarierten Typ zurück.
Der Set-Accessor akzeptiert einen Wertparameter, dessen Typ mit dem deklarierten Typ übereinstimmt.
Zugriffsmodifikatoren von Attributen: In den Get- und Set-Accessoren muss es eine Zugriffsebene mit dem Attribut geben.
Konstrukteur
Die deklarative Konstruktionsmethode besteht darin, eine Methode mit demselben Namen wie die enthaltende Klasse zu deklarieren, aber die Methode hat keinen Rückgabewert.
Wenn ein Konstruktor mit Parametern bereitgestellt wird, stellt der Compiler nicht automatisch einen Standardkonstruktor bereit.
(1) Statischer Konstruktor
log Initialisieren Sie diese Felder und Eigenschaften aus einer externen Quelle, bevor Sie die Klasse zum ersten Mal verwenden.
Die .NET-Laufzeitbibliothek stellt nicht sicher, wann der statische Konstruktor ausgeführt werden soll, daher sollte es nicht erforderlich sein, den Code im statischen Konstruktor zu einem bestimmten Zeitpunkt auszuführen. Aber garantiert ist, dass es vor allen Referenzen nur einmal aufgerufen wird.
Der parameterlose Konstruktor kann in derselben Klasse wie der statische Konstruktor definiert werden.
(2) Rufen Sie andere Konstruktoren vom Konstruktor
base und auf this Keywords
3.3.3 Schreibgeschützte Felder
Der Unterschied zwischen schreibgeschützten und const :
readonly kann im Konstruktor zugewiesen werden, und const kann nirgendwo zugewiesen werden, es kann nur initialisiert werden.
var und Die neuen Schlüsselwörter können zusammen verwendet werden, um beispielsweise anonyme Typen zu erstellen.
static void Main(string[] args) 2 3 4 { 5 6 7 var test = new { Name = "Earl Jones", Age = 17 }; 8 9 10 Console.WriteLine(test.ToString()); 11 12 13 Console.WriteLine(test.Name.GetType().ToString()); 14 15 16 Console.WriteLine(test.Age.GetType().ToString()); 17 18 19 Console.ReadKey(); 20 21 22 } 复制代码
Die Ausgabe ist wie folgt:
Der Typ dieses Objekts , der Compiler „fake“ Wenn Sie einen Namen dafür haben, aber nur der Compiler ihn verwenden kann, können und sollten wir keine Typreflexion für das neue Objekt verwenden, da dies kein konsistentes Ergebnis ist.
Strukturen unterstützen keine Vererbung
, aber alle Strukturen erben von System.ValueType, das wiederum von System.Object erbt.Mithilfe von Strukturen können Sie festlegen, wie Felder im Speicher angeordnet werden.
Für Strukturen stellt der Compiler immer einen Standardkonstruktor ohne Argumente bereit, der nicht ersetzt werden darf, und für Felder können keine Anfangswerte bereitgestellt werden in der Struktur. Es muss im Konstruktor bereitgestellt werden.
Öffentliche Felder in einer Struktur sind akzeptable Programmiermethoden.
在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,所以以下代码不被报错。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;
覆盖结构默认的构造函数会报错:
在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。
强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #000000;"> MyClass myClass;<br/></span><span style="color: #008080;">2</span> WeakReference weakMyClass = <span style="color: #0000ff;">new</span> WeakReference(<span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass());<br/></span><span style="color: #008080;">3</span> <span style="color: #0000ff;"><a href="http://www.php.cn/wiki/109.html" target="_blank">if</a></span><span style="color: #000000;"> (weakMyClass.IsAlive)<br/></span><span style="color: #008080;">4</span> <span style="color: #000000;"> {<br/></span><span style="color: #008080;">5</span> myClass = weakMyClass.Target <span style="color: #0000ff;">as</span><span style="color: #000000;"> MyClass;<br/></span><span style="color: #008080;">6</span> <span style="color: #000000;"> Console.WriteLine(myClass.value); <br/></span><span style="color: #008080;">7</span> <span style="color: #000000;"> } </span></span>
Partial关键字可以允许把类、结构、方法或结构放在多个文件中。
如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:
访问修饰符
abstract
sealed
new
一般约束
所有类都继承自System.Object类。
方法:
ToString();
GetHashCode();
Equals();这里有三个比较三个用于比较对象相等性的方法。
Finalize();
GetType();
GMemberwiseClone();
扩展方法用于在某些不能直接修改源代码中的类中添加方法。
1 using System; 2 3 namespace 扩展方法 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 MyClass myClass1 = new MyClass(); 10 myClass1.SayHiToSomeone(); 11 myClass1.SayHi(); 12 Console.ReadKey(); 13 } 14 } 15 16 class MyClass 17 { 18 public void SayHi() 19 { 20 Console.WriteLine("我是最原始的方法"); 21 } 22 } 23 24 static class AddMyClass 25 { 26 static public void SayHiToSomeone(this MyClass myClass)27 { 28 Console.WriteLine("我是一个扩展方法"); 29 } 30 31 static public void SayHi(this MyClass myClass) 32 { 33 Console.WriteLine("我是扩展方法SayHi"); 34 } 35 } 36 }
输出的结果:
由上得出:
扩展方法必须定义在一个静态类中。
扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。
即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。
如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。
Das obige ist der detaillierte Inhalt vonC# Advanced Programming (3) – Detaillierte Erläuterung von Objekten und Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!