<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mingbo &#187; 类</title>
	<atom:link href="http://shao.mingbo.de/tag/%e7%b1%bb/feed/" rel="self" type="application/rss+xml" />
	<link>http://shao.mingbo.de</link>
	<description>包括教育技术，编程，互联网等方面的文章及随想。</description>
	<lastBuildDate>Thu, 26 Aug 2010 02:57:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>csharp对象和类的学习笔记</title>
		<link>http://shao.mingbo.de/2009/11/26/object-and-class-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/11/26/object-and-class-in-csharp/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 12:18:44 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[.NET 编程]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[类]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=256</guid>
		<description><![CDATA[如左图所示（点击查看大图），首先这一章需要理清的一对关系是，结构和类。这里尤其需要说明的是： 虽然结构本身不支持继承，但隐藏在他背后的还是有一条鲜为人知的继承链：Struct继承于System.ValueType，而System.ValueType继承与System.Object。除此“一脉相传”之外，你不允许给他指定任何基类，也不允许从任何结构继承点什么。在我看来，这样的框架设计也正好符合了“万事万物皆对象”的原则。 结构的默认构造函数会将其申明的字段初始化为标准的默认值，直接对字段进行赋值初始化会遭到编译器的拒绝。但，重载构造函数可以绕过这个限制。（c# professional 2008 P155 Constructors for Structs在这一点上貌似提的有些问题） 在我早先的知识结构中，编程这块主要是C和Java。所以对于下面提到的一些问题会有点陌生： 函数成员-&#62;方法-&#62;传递参数-&#62;out关键字。与之相对的有一个ref关键字。ref挺好理解的，就是按引用传递，貌似c中的按地址传递参数。c#中，无论是值传递，还是引用类型传递，都需要先进行初始化。但真正在编程的过程中，初始化的数据往往是不重要的，甚至有的时候函数就没用过那些被初始化的数据，自然的不论是客户还是programer都希望看到的是计算后的那些amazing的，有意义的符号。out关键字，使得程序员能够摆脱这一初始化的僵局，当在方法参数中申明一个out变量时，编译器自动对其进行初始化，该变量通过引用传送。另外，在函数体内，如果未对out参数分配一个值的话，那编译器是不会通过验证的。当然，在调用该方法时，也需要继续指明out关键字。 函数成员-&#62;方法-&#62;方法重载（帅哥说咱这个阶段暂时只用记住2点：） 两个方法不能仅仅只在返回类型上有区别。 两个方法不能仅仅只在参数申明为out还是ref来区别。 函数成员-&#62;构造函数 有一个默默奉献的默认构造函数，不论你是否重构构造函数，还是压根没有动手描述它，它总是会隐式的自动调用，并为我们将字段初始化为标准的默认值，其功能也仅限于此。不过，下述情况是个意外。 把构造函数private化（也就是传说中的对象实例化的类代理），直接实例化是不可能实现的，因为在外部，new是没有办法使用的。一般来说，这样做是为了： 作为储存静态成员或属性的容器。 仅通过调用某个静态函数成员来实例化（可以保证在程序中只有一个该类的实例，需加锁）demo如下,注意观看getAtestClassInstance方法。 class Program { static void Main(string[] args) { testClass t = testClass.getAtestClassInstance(100); Console.WriteLine(t.b); Console.WriteLine(t.c); } class testClass { private static int a; public int b; public int c; private static testClass t; private static object locker [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://shao.mingbo.de/wp-content/uploads/2009/11/StructVsClass.jpeg"><img class="alignleft size-thumbnail wp-image-259" title="StructVsClass" src="http://shao.mingbo.de/wp-content/uploads/2009/11/StructVsClass-150x107.jpg" alt="StructVsClass 150x107 csharp对象和类的学习笔记" width="150" height="107" /></a>如左图所示（点击查看大图），首先这一章需要理清的一对关系是，<strong>结构和类</strong>。这里尤其需要说明的是：</p>
<ol>
<li>虽然结构本身不支持<strong>继承</strong>，但隐藏在他背后的还是有一条鲜为人知的继承链：<span style="text-decoration: underline;">Struct继承于System.ValueType，而System.ValueType继承与System.Object</span>。除此“一脉相传”之外，你不允许给他指定任何基类，也不允许从任何结构继承点什么。在我看来，这样的框架设计也正好符合了“<strong>万事万物皆对象</strong>”的原则。</li>
<li>结构的默认<strong>构造函数</strong>会将其申明的字段初始化为标准的默认值，直接对字段进行赋值初始化会遭到编译器的拒绝。但，重载构造函数可以绕过这个限制。（c# professional 2008 P155 Constructors for Structs在这一点上貌似提的有些问题）</li>
</ol>
<p><a href="http://shao.mingbo.de/wp-content/uploads/2009/11/ClassMembers1.jpeg"><img class="alignleft size-thumbnail wp-image-270" title="ClassMembers" src="http://shao.mingbo.de/wp-content/uploads/2009/11/ClassMembers1-150x150.jpg" alt="ClassMembers1 150x150 csharp对象和类的学习笔记" width="150" height="150" /></a></p>
<p>在我早先的知识结构中，编程这块主要是C和Java。所以对于下面提到的一些问题会有点陌生：</p>
<p>函数成员-&gt;方法-&gt;传递参数-&gt;out关键字。与之相对的有一个ref关键字。ref挺好理解的，就是按引用传递，貌似c中的按地址传递参数。c#中，无论是值传递，还是引用类型传递，都需要先进行初始化。但真正在编程的过程中，初始化的数据往往是不重要的，甚至有的时候函数就没用过那些被初始化的数据，自然的不论是客户还是programer都希望看到的是计算后的那些amazing的，有意义的符号。out关键字，使得程序员能够摆脱这一初始化的僵局，当在方法参数中申明一个out变量时，编译器自动对其进行初始化，<strong>该变量通过引用传送</strong>。另外，在函数体内，如果未对out参数分配一个值的话，那编译器是不会通过验证的。当然，在调用该方法时，也需要继续指明out关键字。</p>
<p>函数成员-&gt;方法-&gt;方法重载（帅哥说咱这个阶段暂时只用记住2点：）</p>
<ul>
<li>两个方法不能仅仅只在返回类型上有区别。</li>
<li>两个方法不能仅仅只在参数申明为out还是ref来区别。</li>
</ul>
<p>函数成员-&gt;构造函数</p>
<p>有一个默默奉献的<strong>默认构造函数</strong>，不论你是否重构构造函数，还是压根没有动手描述它，它总是会隐式的自动调用，并为我们将字段初始化为标准的默认值，其功能也仅限于此。不过，下述情况是个意外。</p>
<p>把构造函数private化（也就是传说中的对象实例化的类代理），直接实例化是不可能实现的，因为在外部，new是没有办法使用的。一般来说，这样做是为了：</p>
<ul>
<li>作为储存静态成员或属性的容器。</li>
<li>仅通过调用某个静态函数成员来实例化（可以保证在程序中只有一个该类的实例，需加锁）demo如下,注意观看<strong>getAtestClassInstance</strong>方法。</li>
</ul>
<pre lang="csharp">    class Program
    {
        static void Main(string[] args)
        {
            testClass t = testClass.getAtestClassInstance(100);
            Console.WriteLine(t.b);
            Console.WriteLine(t.c);
        }

        class testClass
        {
            private static int a;
            public int b;
            public int c;
            private static testClass t;
            private static object locker = new object();
            private testClass(int a)
            {
                testClass.a = a;
                c = a;
            }

            public static testClass getAtestClassInstance(int a)
            {
                if (t == null)
                {
                    lock(locker)
                    {
                        t = new testClass(a);

                    }
                }
                return t;
            }
        }
    }</pre>
<p>静态构造函数，又是第一次遇到。我想事到如今，或许我们可以总结为：only one吗？请用static。如上述的getAtestClassInstance方法，保证只有一个实例运行。静态构造函数一般有这样几点值得注意和总结：</p>
<ul>
<li><span style="color: #ff0000;">静态构造函数保证至多运行1次</span>，在代码引用类之前，demo如下。</li>
<li>静态构造函数没有访问修饰符，没有其他的c#代码访问它，永远只有.net自己调用。</li>
<li>静态构造函数不能带参数，一个类只能有一个静态构造函数。</li>
<li>无参的实例构造函数与静态构造函数安全共存，因为二者的运行时间不同。</li>
</ul>
<pre lang="csharp">    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(testClass.a);
            new testClass();
            Console.WriteLine(testClass.a);
        }

        class testClass
        {
            public static int a;
            public int b;
            static testClass()
            {
                System.Random r = new Random();
                a=r.Next(10);
            }

        }
    }</pre>
<p><strong>只读字段</strong>的使用规则是，只能在声明时，或构造函数中进行初始化。</p>
<p><strong>扩展方法</strong>是一个静态方法，没有放在类的源代码中。虽然是静态方法，但必须使用实例来调用。如果原类中包含与扩展方法同名的方法，则扩展方法无效。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年12月22日 -- <a href="http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/" title="cSharp中BackgroundWorker的用法">cSharp中BackgroundWorker的用法</a></li><li>2009年12月21日 -- <a href="http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/" title="cSharp中同步类的设计">cSharp中同步类的设计</a></li><li>2009年12月20日 -- <a href="http://shao.mingbo.de/2009/12/20/paralize-thread-in-charp/" title="cSharp中给线程传递参数">cSharp中给线程传递参数</a></li><li>2009年12月19日 -- <a href="http://shao.mingbo.de/2009/12/19/asynchronous-delegate-in-csharp/" title="cSharp中异步委托的笔记">cSharp中异步委托的笔记</a></li><li>2009年12月16日 -- <a href="http://shao.mingbo.de/2009/12/16/dynamic-loading-assemblies-and-reflection-in-csharp/" title="cSharp动态调用和反射的一个绝佳例子">cSharp动态调用和反射的一个绝佳例子</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/11/26/object-and-class-in-csharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
