TechEd北アメリカ2008の開発者の会議で、私は参照のタイプおよび値のタイプについての活発な議論に拍車をかけた、.NETのプログラミングの基本原則に焦点を合わせた興味深い話を聞いた。 より多くの話された人々それは何人人々が主題を誤解するか明らかだった。 これを念頭において、私はすべての.NETの開発者が同じページにあることを確かめるためにトピックをカバーすることにした。
参照のタイプ
参照のタイプは価値のメモリアドレスへの参照を貯え、積み重ねで割振られる。 参照のタイプはself-describingタイプ、ポインターのタイプ、またはインターフェイスの種類のどちらである場合もある。 データタイプはself-describingタイプの価値から断固としたである場合もある。 Self-describingタイプは配列およびクラスのタイプに更に裂ける。 クラスのタイプはユーザー定義のクラス、囲まれた値のタイプおよび代表者である。
.NETフレームワークはいろいろな参照のタイプを含んでいる; これはすべての配列と共にひもの目的を、(要素が値のタイプでも)、クラスタイプする、代表者含み。 目的クラスから受継ぐ何でもとして参照のタイプについて考えることができる; これはあなたが作成するあらゆる目的が参照のタイプであることを意味する。
参照のタイプを識別する一方通行は値のタイプのために使用されない新しいキーワードの使用によって行う。 C#の次の断片は参照のタイプであるStringBuilderの目的の作成を示す。
StringBuilderのSb =新しいStringBuilder ();
ランタイムは参照のタイプを取扱うとき、記憶の2つのスペースを割振る: 実際の目的(前例のStringBuilder)のための1つおよび参照(前例のSb)のための1。 実際の目的は管理された積み重ねで貯えられる、従って塵芥収集車の範囲の内にある。 気分にさせ方法が記憶を解放し、塵芥収集車に使用できるようにするのに使用されている。
一方で、目的への参照は積み重ねで貯えられる。 参照を使用するときタイプする、目的への参照を使用していることをシステムに告げることをC#で呼ぶときrefのキーワードは方法署名で、そして使用される。 VB.NETでは、ByRefは何もの方法署名で方法が呼ばれるとき使用される。
値のタイプ
簡単に言えば、値のタイプはデータを含んでいる。 なお、それらは積み重ねで割振られるか、または構造でインラインに割振られる。 値のタイプは作り付け(ランタイムまでに実行されて)、ユーザー定義、または等置のどちらである場合もある。
.NETフレームワークは多数の作り付けの値のタイプを含んでいる; これはすべての構造(彼らのメンバーが参照のタイプでも)、および等置と共にすべての数字データのタイプ、ブール、木炭および日付のクラスを含んでいる。 値のタイプはSystem.ValueTypeのクラスから直接受継ぐ; 但し、値のタイプは密封される従ってそれらから他のクラスを得ないことができる。
値のタイプは直接アクセスされる-新しいキーワードのための必要性がない。 次のVB.NETの断片は幾つかの値のタイプの作成を示す。
整数として薄暗いカウンター
ブール薄暗い終了する;
カウンター= 1;
終了する=偽;
値のタイプは積み重ねで貯えられる、従って塵芥収集車によって影響されない。 .NETのランタイムは値のタイプを使用するとき、根本的なデータを直接取扱う。 値のタイプは頻繁により重い参照のタイプに対してより軽いタイプと言われる。
参照および行為を値のタイプ
次の簡単な例は参照のタイプの使用を示したものだ(新しいキーワードによって)。 簡単な人のクラスは使用される(タイトルと共に姓および名)。 2つの方法(積み過ぎられたSwapPeople)がクラスの例を処理するのに使用されている。
この例はまた継ぎ目無く参照と値のタイプの間で動く.NETフレームワークおよび機能の特徴を説明したものだ。 編集者は頻繁に背景で2つのタイプの間で自動的に動く; これはボクシングおよび箱から出ることと呼ばれる。 概念はSwapValue方法で示される。
各方法は一時的な目的を使用してそれらを互いに置くことによって目的を交換する。 最初の方法は参照(refのキーワード)を渡される二人用の目的を受け入れる。 refのキーワードが方法署名で使用されること、そして実際に呼ばれるいつ気づきなさい。 第2方法はrefのキーワードを使用しない、従って実際の目的は渡される。
最初の方法は目的を交換し、参照が使用されるので交換は方法の範囲外で確認される。 第2方法は目的を交換するが、実際の目的が使用されるので方法の内だけで目に見える(渡されるref無し)。 各方法は方法に通じる目的の1つに置かれるTempと呼ばれる人のクラスの例を使用する。 それは目的の価値を得ないが、むしろ目的を含んでいるメモリ・スペースを指す。
第3方法は参照によって2つの値のタイプ(整数)を交換する。 それは参照のタイプにそれらを変えるのにボクシングを利用する従って変更は方法の外で確認される。 最後の方法は参照を使用しない、従って価値は方法の外で確認されない変更との方法に通じる。
システムを使用して;
System.Collections.Genericを使用して;
System.Textを使用して;
namespace ValueAndReferenceTypes {
クラスプログラム{
空電の無効の主要(ひもの[] args) {
人person1 =新しい人();
person1.Populate (「メリー」、「Weilage」、「編集者」);
人person2 =新しい人();
person2.Populate (「トニー」、「Patton」、「貢献者」);
Console.WriteLine (「交換の前に…」);
Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title);
Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title);
SwapPeople (ref person1、ref person2);
Console.WriteLine (「交換の後で…」);
Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title);
Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title);
SwapPeople (person1、person2);
Console.WriteLine (「交換の後で…」);
Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title);
Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title);
int a = 1;
int b = 2;
Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ());
SwapValue (ref a、b) ref;
Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ());
SwapValue (aのb);
Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ());
}
公共の静的な無効のSwapPeople (ref人per1、ref人per2) {
人の臨時雇用者;
臨時雇用者= per1;
per1 = per2;
per2 =臨時雇用者;
}
公共の静的な無効のSwapPeople (人per1、人per2) {
人の臨時雇用者;
臨時雇用者= per1;
per1 = per2;
per2 =臨時雇用者;
Console.WriteLine (「SwapPeople方法で…」);
Console.WriteLine (per1.FirstName + 「「+ per1.LastName +」 -- 「+ per1.Title);
Console.WriteLine (per2.FirstName + 「「+ per2.LastName +」 -- 「+ per2.Title);
}
公共の静的な無効のSwapValue (ref int a、b) ref int {
int t;
t = a;
a = b;
b = t;
}
公共の静的な無効のSwapValue (int a、b) int {
int t;
t = a;
a = b;
b = t;
}}
クラス人{
公共のひもFirstName;
公共のひもLastName;
公共のひものタイトル;
公衆の空間は住む(ひものfname、ひものlname、ひものタイトル) {
FirstName = fname;
LastName = lname;
タイトル=タイトル;
}}}
次の出力は発生する:
交換の前… トニーPatton -貢献者 トニーPatton -貢献者 交換の後… SwapPeople (ref person1、ref person2)への呼出しの前… トニーPatton -貢献者 トニーPatton -貢献者 SwapPeople (ref person1、ref person2)への呼出しの後… トニーPatton -貢献者 トニーPatton -貢献者 SwapPeople方法… トニーPatton -貢献者 トニーPatton -貢献者 SwapPeople (person1、person2)への呼出しの後… トニーPatton -貢献者 トニーPatton -貢献者 SwapValue (ref c、d) refへの呼出しの前… a=1b= 2 SwapValue (ref c、d) refへの呼出しの後… a=2 b= 1 SwapValue (c、d)への呼出しの後… a=2 b= 1
コードのVB.NET版は続く:
モジュールModule1 補助的な本管() 新しい人として薄暗いperson1 () person1.Populate (「メリー」、「Weilage」、「編集者」) 新しい人として薄暗いperson2 () person2.Populate (「トニー」、「Patton」、「貢献者」) 人= person1として薄暗い臨時雇用者 Console.WriteLine (「交換の前に…」) Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title) Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title) SwapPeople1 (person1、person2) Console.WriteLine (「SwapPeople1 (ByRef person1、ByRef person2)への呼出しの後で…」) Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title) Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title) SwapPeople2 (person1、person2) Console.WriteLine (「SwapPeople2 (person1、person2)への呼出しの後で…」) Console.WriteLine (person1.FirstName + 「「+ person1.LastName +」 -- 「+ person1.Title) Console.WriteLine (person2.FirstName + 「「+ person2.LastName +」 -- 「+ person2.Title) 整数としてaを= 1薄暗くしなさい 整数としてbを= 2薄暗くしなさい Console.WriteLine (「の前にSwapValue1 (ByRef c、d) ByRef…」)への呼出し Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ()) SwapValue1 (aのb) Console.WriteLine (「の後でSwapValue2 (c、d)…」)への呼出し Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ()) SwapValue2 (aのb) Console.WriteLine (「の後でSwapValue (c、d)…」)への呼出し Console.WriteLine (「a=」+ a.ToString () +」b= 「+ b.ToString ()) 潜水艦を終えなさい 公共の潜水艦SwapPeople1 (ByRef per1、人として人としてByRef per2) 人として薄暗い臨時雇用者 臨時雇用者= per1 per1 = per2 per2 =臨時雇用者 端の潜水艦 公共の潜水艦SwapPeople2 (ByVal per1、人として人としてByVal per2) 人として薄暗い臨時雇用者 臨時雇用者= per1 per1 = per2 per2 =臨時雇用者 Console.WriteLine (「SwapPeople方法で…」) Console.WriteLine (per1.FirstName + 「「+ per1.LastName +」 -- 「+ per1.Title) Console.WriteLine (per2.FirstName + 「「+ per2.LastName +」 -- 「+ per2.Title) 端の潜水艦 公共の潜水艦SwapValue1 (ByRef c、整数として整数としてByRef d) 整数として薄暗いt t = c c = d d = t 端の潜水艦
公共の潜水艦SwapValue2 (ByVal c、整数として整数としてByVal d) 整数として薄暗いt t = c c = d d = t 端の潜水艦 端モジュール クラス人 ひもとして公共のFirstName ひもとして公共のLastName ひもとして公共のタイトル 潜水艦は住む(ひもとしてひも、ByValのlname、ひもとしてByVal title1としてByValのfname) FirstName = fname LastName = lname タイトル= title1 端の潜水艦 端のクラス
フレームワークの中
参照のタイプおよび値のタイプを使用は通常毎日のプログラミングの雑用の間に多くの思考を与えられない; しかし.NETの証明を追求することを選べば両方のタイプをよく知られるべきである。 また、両方のタイプの固体理解は毎日のプログラミングの仕事で助ける。
混同を常に見つけるか、または約疑問に思ったこと.NETフレームワークの面があるか。 私にウェブ開発者の議論で知らせなさい。
トニーPattonはアプリケーション開発者の獲得ジャワ、VB、はすおよびXMLの証明として彼の知識をささえ彼の職歴を始めた。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
あなたのinboxの週間開発の先端を得なさい
あなたの開発者の技術を毎火曜日渡されるTechRepublicのウェブ開発者の時事通信に自由に申し込むことによって鋭い保ちなさい。 自動的に今日予約購読しなさい!
