ホームページ  >  記事  >  バックエンド開発  >  C#応用プログラミング(3) - オブジェクトと型を詳しく解説

C#応用プログラミング(3) - オブジェクトと型を詳しく解説

黄舟
黄舟オリジナル
2017-03-20 13:33:141183ブラウズ

3.2 クラスと構造体

クラスと構造体の違いは、ストレージメソッドアクセスメソッドです(ヒープに格納される参照型に似ていますが、構造体はスタック値型に格納されます) ) とそのいくつかの特徴

構文的には、クラスは構造体と非常に似ていますが、主な違いは、構造体が class の代わりにキーワード struct を使用して宣言されることです。

3.3 クラスメンバー

3.3.1 データメンバー

データメンバーにはクラスデータ、フィールド定数、およびMember ofが含まれます。 イベント .

3.3.2 FunctionMembers

Functionメンバーは、methodspropertiesconstructorを含む、クラス内のデータを操作するための特定の関数を提供します。 デストラクター (ファイナライザー) オペレーター、およびインデクサー


    1. method

の違い: ref は渡す前に初期化されている必要があります。

out

は必要ありません。 の本質は値の型を参照渡しすることであり、outは戻り値を増やすことです。 cco Groom \\ は、パラメーターを渡すプロセスで指定できます。メソッドパラメータの最後になければなりません。

パラメータ。概念: 属性は、クライアント コードの観点からは、メソッドまたはメソッドのペアです。 get アクセサーはパラメーターを受け取らず、プロパティで宣言された型を返します。

setアクセサは、宣言された型と同じ型の値パラメータを受け取ります。

属性アクセス修飾子: get および set アクセサーには、属性のアクセス レベルが必要です。


    1. コンストラクタcau canは次のものを見つけることができます。

    パラメータ付きのコンストラクタが提供された場合、コンパイラはデフォルトのコンストラクタを自動的に提供しません。

.NETランタイムライブラリは静的コンストラクターをいつ実行するかを保証しないため、特定の時間に静的コンストラクター内のコードを実行する必要はありません。ただし、すべての参照の前に 1 回だけ呼び出されることが保証されています。

パラメータなしのコンストラクタは、静的コンストラクタと同じクラスで定義できます。 3. 3.3 読み取り専用フィールド

readonly

const

の違い:

readonly

はコンストラクターで割り当てることができますが、 const はどこにも代入できません、初期化のみです。 3.4 匿名型

var

new キーワードを一緒に使用して、たとえば匿名型を作成できます。

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         }
复制代码

出力は次のとおりです: このオブジェクト

の型はわかりません、コンパイラはその名前を「偽造」しましたが、コンパイラだけがそれを使用できますまた、一貫した結果が得られないため、新しいオブジェクトに対していかなるタイプのリフレクションも使用しないでください。

3.5 構造体 構造体は参照型ではなく、値型です。そのライフサイクルの制限は、単純なデータ型の制限と同じです。構造損失を通過するとパフォーマンスが低下します。

構造体は、一般に単純な結合データを表現するために使用されます。

構造体はinheritanceをサポートしていませんが、すべての構造体はSystem.ValueTypeを継承し、System.ValueTypeはSystem.Objectを継承します。

構造体を使用すると、メモリ内でのフィールドのレイアウト方法を指定できます。

1 MyStruct myStruct /*= new MyStruct()*/;
2 myStruct.Name = "Earl Jones";
3 myStruct.Age = 17;

  覆盖结构默认的构造函数会报错

    

 

 

3.6 弱引用

  在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。

  强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:

<span style="font-family: &#39;Microsoft YaHei&#39;;"><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>

3.7 部分类

  Partial关键字可以允许把类、结构、方法或结构放在多个文件中。

  如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:

  •   访问修饰符

  •   abstract

  •   sealed

  •   new

  •   一般约束

3.9 Object类

  所有类都继承自System.Object类。

  方法:

  • ToString();

  • GetHashCode();

  • Equals();这里有三个比较三个用于比较对象相等性的方法。

  • Finalize();

  • GetType();

  • GMemberwiseClone();

3.10 扩展方法

  扩展方法用于在某些不能直接修改源代码中的类中添加方法。

 


 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 后的类,这个方法就是这个类的一部分。

  •     即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。

  •     如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。

 

以上がC#応用プログラミング(3) - オブジェクトと型を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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