• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Javen-Studio 咖啡小屋

            http://javenstudio.org - C++ Java 分布式 搜索引擎
            Naven's Research Laboratory - Thinking of Life, Imagination of Future

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              24 隨筆 :: 57 文章 :: 170 評(píng)論 :: 4 Trackbacks

            3.5         結(jié)構(gòu)型值和類型(Structured values and types

            LINQ 項(xiàng)目以數(shù)據(jù)為中心的程序設(shè)計(jì)格式(data-centric programming style),有些類型存在的主要目的是在結(jié)構(gòu)型值之上(over a structured value)提供一個(gè)靜態(tài)的“shape”(static "shape"),這勝過同時(shí)有聲明(state)和行為(behavior)的完全成熟(full-blown)的對(duì)象。對(duì)它的邏輯結(jié)論(logical conclusion)作出這個(gè)假設(shè)(taking this premise),最常見的情形(is often the case)是所有的開發(fā)者當(dāng)心(cares about)值的結(jié)構(gòu)(structure of the value),對(duì)這個(gè) shape 一個(gè)命名的類型(named type)的需要(the need for)是幾乎無(wú)用的(is of little use)。這導(dǎo)致(leads to)匿名類型(anonymous types)的介紹(introduction)允許新的結(jié)構(gòu)(structures)給它們的初始化(initialization)定義成“inline”。

             

            C# 語(yǔ)言里,匿名類型(anonymous types)與對(duì)象初始化的語(yǔ)法(object initialization syntax)是一樣的(is identical to),除了類型的名字(name of the type)被忽略(omitted)了。例于,考察下面的兩段語(yǔ)句:

             

            object v1 = new Person {
                Name 
            = "Chris Smith", Age = 31, CanCode = false
            }
            ;

            object v2 = new // note the omission of type name
                Name = "Chris Smith", Age = 31, CanCode = false
            }
            ;

             

            變量 v1 v2 都指向一個(gè)內(nèi)存中的對(duì)象(in-memory object),它的 CLR 類型有三個(gè)公共的屬性(public properties):NameAge,和CanCode。它們的不同之處(differ in)是 v2 引用自(refers to)一個(gè)匿名類型(anonymous types)的實(shí)體。在 CLR 中(in CLR terms),匿名類型與任何其他類型沒有什么不同。使得匿名類型特殊(special)的是它們?cè)谀愕某绦蜷_發(fā)語(yǔ)言中沒有特殊意義的名字(have no meaningful name)。創(chuàng)建一個(gè)匿名類型的實(shí)體(instances of an anonymous type)的唯一途經(jīng)就是使用上面所示的語(yǔ)法。

             

            為了允許變量引用匿名類型的實(shí)體仍然需要利用(benefit from)靜態(tài)類型(static typing),C# 介紹 var 關(guān)鍵詞時(shí)說(shuō)它可以用于局部變量定義(local variable declarations)的類型名稱(type name),例于,考察下面這段合法(legal)的 C# 3.0 程序:

             

            var s = "Bob";
            var n 
            = 32;
            var b 
            = true;

             

            關(guān)鍵詞 var 告訴編譯器從用來(lái)初始化變量的表達(dá)式的靜態(tài)類型(static type)來(lái)推斷(infer)這個(gè)變量的類型。在這個(gè)例子中,變量 sn b 的類型分別(respectively)是 stringint bool,這段程序和下面的程序是一樣的:

             

            string s = "Bob";
            int    n = 32;
            bool   b = true;

             

            關(guān)鍵詞 var 對(duì)那些類型有特殊含義名稱(meaningful names)的變量是一個(gè)方便的工具(convenience),但是它對(duì)引用自匿名類型的實(shí)體的變量(instances of anonymous types)卻是必需的(necessity)。

             

            var value = new 
              Name 
            = "Chris Smith", Age = 31, CanCode = false
            }
            ;

             

            在上面的例子中,變量 value 是一個(gè)匿名類型,它的定義與下面的 C# 偽代碼(pseudo-C#:)是相等的(equivalent to):

             

            internal class ??? {
              
            string _Name;
              
            int    _Age;
              
            bool   _CanCode;

              
            public string Name 
                
            get return _Name; } set { _Name = value; }
              }


              
            public int Age
                
            get return _Age; } set { _Age = value; }
              }


              
            public bool CanCode 
                
            get return _CanCode; } set { _CanCode = value; }
              }

            }

             

            匿名類型不能被共享于(shared)跨越(across)匯編后代碼的邊界(assembly boundaries),但是編譯保證(ensures)在每段匯編代碼中(within each assembly)對(duì)被賦予的(given)成 name/type 對(duì)(name/type pairs)的屬性序列(sequence of property)最多只有一個(gè)匿名類型。

             

            因?yàn)槟涿愋统31挥迷趶囊粋€(gè)現(xiàn)有的結(jié)構(gòu)型值(an existing structured value)中選取它的一個(gè)或更多的成員的投影(projections)中,這樣我們就能夠簡(jiǎn)單地在一個(gè)匿名類型的初始化(initialization of an anonymous type)中從另一個(gè)值引用(reference)域(fields)或?qū)傩裕?/SPAN>properties)。這導(dǎo)致(results in)匿名類型獲取到一個(gè)屬性(property),它的名稱(name),類型(type)和值(value)都拷貝自引用的屬性或域(referenced property or field)。

             

            舉例來(lái)說(shuō),下面的程序通過從其他值中結(jié)合屬性(combining properties)來(lái)創(chuàng)建一個(gè)新的結(jié)構(gòu)性值(structured value):

             

            var bob = new Person { Name = "Bob", Age = 51, CanCode = true };
            var jane 
            = new { Age = 29, FirstName = "Jane" };

            var couple 
            = new {
                Husband 
            = new { bob.Name, bob.Age },
                Wife 
            = new { Name = jane.FirstName, jane.Age }
            }
            ;

            int    ha = couple.Husband.Age; // ha == 51
            string wn = couple.Wife.Name;   // wn == "Jane"

             

            上面展示的引用域(fields)或?qū)傩裕?/SPAN>properties)的代碼是與下面寫出的更明顯的形式(more explicit form)的一種更簡(jiǎn)單方便的語(yǔ)法(is simply a convenient syntax):

             

            var couple = new {
                Husband 
            = new { Name = bob.Name, Age = bob.Age },
                Wife 
            = new { Name = jane.FirstName, Age = jane.Age }

            }
            ;

             

            在兩種形式中(in both cases),變量 couple 都從變量 bob jane 中的 Name Age 屬性獲取了一份自己的 copy

             

            匿名類型通常用于查詢的 select 語(yǔ)句(select clause),例于,看下面的查詢程序:

             

            var expr = people.Select(p => new 
                           p.Name, BadCoder 
            = p.Age == 11
                       }
            );

            foreach (var item in expr) 
              Console.WriteLine(
            "{0} is a {1} coder"
                                 item.Name,
                                 item.BadCoder 
            ? "bad" : "good");

             

            在這個(gè)例子中我們能夠在類型 Person 上創(chuàng)建一個(gè)新的投影(projection),它正確地符合(exactly matched)我們的執(zhí)行代碼(processing code)所需要的形態(tài)(shape),但是仍然具有靜態(tài)類型(static type)的好處(the benefits of)。

             

             

             

            待續(xù), 錯(cuò)誤難免,請(qǐng)批評(píng)指正,譯者Naven 2005-10-23

            posted on 2005-10-24 01:05 Javen-Studio 閱讀(479) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品青青草原伊人| 久久久久久久精品成人热色戒| 亚洲国产天堂久久综合| 韩国三级大全久久网站| 人妻无码αv中文字幕久久| 免费精品国产日韩热久久| 久久久久久久国产免费看| 久久精品一区二区国产| 狠狠色婷婷综合天天久久丁香 | 国色天香久久久久久久小说| 久久综合久久综合亚洲| 亚洲欧美日韩精品久久亚洲区 | 精品久久香蕉国产线看观看亚洲| 亚洲va久久久噜噜噜久久天堂| 国产成人精品综合久久久久| 国内精品久久久久影院薰衣草| 伊人久久大香线蕉av不卡| 亚洲乱码精品久久久久..| 亚洲精品高清国产一线久久| 无码人妻少妇久久中文字幕蜜桃| 久久综合给合久久国产免费 | 日批日出水久久亚洲精品tv| 久久艹国产| 久久受www免费人成_看片中文| 国内精品人妻无码久久久影院导航| 久久夜色精品国产噜噜麻豆| 久久九九全国免费| 久久国产精品二国产精品| 色青青草原桃花久久综合| 伊人久久精品无码二区麻豆| 韩国三级大全久久网站| 九九久久精品无码专区| 亚洲精品乱码久久久久久蜜桃图片| 国产精品久久久久AV福利动漫| 91精品国产91久久久久久| 亚州日韩精品专区久久久| 亚洲人成精品久久久久| 青青草国产精品久久久久| 伊人色综合久久天天网| 狠狠色噜噜狠狠狠狠狠色综合久久 | 久久国产一片免费观看|