zoukankan      html  css  js  c++  java
  • 在C#中创建类型

    重载构造函数:

    using System;
    
    public class Wine
    {
      public decimal Price;
      public int Year;
      public Wine (decimal price) { Price = price; }
      public Wine (decimal price, int year) : this (price) { Year = year; }
    }

    对象初始化:

    public class Bunny
    {
      public string Name;
      public bool LikesCarrots;
      public bool LikesHumans;
    
      public Bunny () {}
      public Bunny (string n) { Name = n; }
    }
    Bunny b1 = new Bunny { Name="Bo", LikesCarrots=true, LikesHumans=false };
    Bunny b2 = new Bunny ("Bo")     { LikesCarrots=true, LikesHumans=false };

    this引用:

    public class Panda
    {
      public Panda Mate;
    
      public void Marry (Panda partner)
      {
        Mate = partner;
        partner.Mate = this;
      }
    }
    public class Test
    {
      string name;
      public Test (string name) { this.name = name; }
    }

    属性:

    public class Stock
    {
      decimal currentPrice;           // The private "backing" field
    
      public decimal CurrentPrice     // The public property
      {
         get { return currentPrice; } set { currentPrice = value; }
      }
    }

    只读和已计算属性:

    public class Stock
    {
      string  symbol;
      decimal purchasePrice, currentPrice;
      long    sharesOwned;
    
      public Stock (string symbol, decimal purchasePrice, long sharesOwned)
      {
        this.symbol = symbol;
        this.purchasePrice = currentPrice = purchasePrice;
        this.sharesOwned = sharesOwned;
      }
    
      public decimal CurrentPrice  { get { return currentPrice;             }
                                     set { currentPrice = value;            } }
      public string Symbol         { get { return symbol;                   } }
      public decimal PurchasePrice { get { return purchasePrice;            } }
      public long    SharesOwned   { get { return sharesOwned;              } }
      public decimal Worth         { get { return CurrentPrice*SharesOwned; } }
    }
    
    class Test
    {
      static void Main()
      {
        Stock msft = new Stock ("MSFT", 20, 1000);
        Console.WriteLine (msft.Worth);                // 20000
        msft.CurrentPrice = 30;
        Console.WriteLine (msft.Worth);                // 30000
      }
    }

    自动属性:

    public class Stock
    {
      // ...
      public decimal CurrentPrice { get; set; }
    }

    get 和 set 访问:

    public class Foo
    {
      private decimal x;
      public decimal X
      {
        get          {return x;} 
        internal set {x = value;}
      }
    }

    实现索引:

    public class Portfolio
    {
      Stock[] stocks;
      public Portfolio (int numberOfStocks)
      {
        stocks = new Stock [numberOfStocks];
      }
    
      public int NumberOfStocks { get { return stocks.Length; } }
    
      public Stock this [int index]      // indexer
      { 
        get { return stocks [index];  }
        set { stocks [index] = value; }
      }
    }
    
    class Test
    {
      static void Main()
      {
        Portfolio portfolio = new Portfolio(3);
        portfolio [0] = new Stock ("MSFT", 20, 1000);
        portfolio [1] = new Stock ("GOOG", 300, 100);
        portfolio [2] = new Stock ("EBAY", 33, 77);
    
        for (int i = 0; i < portfolio.NumberOfStocks; i++)
          Console.WriteLine (portfolio[i].Symbol);
      }
    }

    多索引:

    public class Portfolio
    {
      ...
      public Stock this[string symbol]
      {
        get
        {
          foreach (Stock s in stocks)
            if (s.Symbol == symbol)
              return s;
          return null;
        }
      }
    }

    静态构造函数:

    class Test
    {
      static Test()
      {
        Console.WriteLine ("Type Initialized");
      }
    }

    Partial方法:

    // PaymentFormGen.cs — auto-generated
    partial class PaymentForm
    {
      // ...
      partial void ValidatePayment(decimal amount);
    }
    
    // PaymentForm.cs — hand-authored
    partial class PaymentForm
    {
      // ...
      // partial void ValidatePayment(decimal amount)
      {
        if (amount > 100)
        {
          // ...
        }
      }
    }

    继承:

    public class Asset
    {
      public string  Name;
      public decimal PurchasePrice, CurrentPrice;
    }
    public class Stock : Asset   // inherits from Asset
    {
      public long SharesOwned;
    }
    
    public class House : Asset   // inherits from Asset
    {
      public decimal Mortgage;
    }
    
    class Test
    {
      static void Main()
      {
        Stock msft = new Stock()
        { Name="MSFT", PurchasePrice=20, CurrentPrice=30, SharesOwned=1000 };
    
        House mansion = new House
        { Name="McMansion", PurchasePrice=300000, CurrentPrice=200000,
          Mortgage=250000 };
    
        Console.WriteLine (msft.Name);           // MSFT
        Console.WriteLine (mansion.Name);        // McMansion
    
        Console.WriteLine (msft.SharesOwned);    // 1000
        Console.WriteLine (mansion.Mortgage);    // 250000
      }
    }

    多态:

    class Test
    {
      static void Main()
      {
        Stock msft    = new Stock ... ;
        House mansion = new House ... ;
        Display (msft);
        Display (mansion);
      }
    
      public static void Display (Asset asset)
      {
        System.Console.WriteLine (asset.Name);
      }
    }
    static void Main() { Display (new Asset()); }    // Compile-time error
    
    public static void Display (House house)         // Will not accept Asset
    {
      System.Console.WriteLine (house.Mortgage);
    }

    向下转换:

    Stock msft = new Stock();
    Asset a = msft;                      // upcast
    Stock s = (Stock)a;                  // downcast
    Console.WriteLine (s.SharesOwned);   // <No error>
    Console.WriteLine (s == a);          // true
    Console.WriteLine (s == msft);       // true

    虚拟函数成员:

    public class Asset
    {
      ...
      public virtual decimal Liability { get { return 0; } }
    }
    
    public class Stock : Asset { ... }
    
    public class House : Asset
    {
      ...
      public override decimal Liability { get { return Mortgage; } }
    }
    House mansion = new House
     { Name="McMansion", PurchasePrice=300000, CurrentPrice=200000,
       Mortgage=250000 };
    
    Asset a = mansion;
    decimal d2 = mansion.Liability;      // 250000

    抽象类和抽象成员:

    public abstract class Asset
    {
      ...
      public abstract decimal NetValue { get; }   // Note empty implementation
    }
    
    public class Stock : Asset
    {
      ...                                     // Override an abstract method
      public override decimal NetValue        // just like a virtual method.
      {
        get { return CurrentPrice * SharesOwned; }
      }
    }
    
    public class House : Asset     // Every non abstract subtype must
    {                              // define NetValue.
      ...
      public override decimal NetValue
      {
        get { return CurrentPrice - Mortgage; }
      }
    }

    new 和 virtual

    public class BaseClass
    {
      public virtual void Foo()  { Console.WriteLine ("BaseClass.Foo"); }
    }
    
    public class Overrider : BaseClass
    {
      public override void Foo() { Console.WriteLine ("Overrider.Foo"); }
    }
    
    public class Hider : BaseClass
    {
      public new void Foo()      { Console.WriteLine ("Hider.Foo"); }
    }
    Overrider o = new Overrider();
    BaseClass b1 = o;
    o.Foo();                           // Overrider.Foo
    b1.Foo();                          // Overrider.Foo
    
    Hider h = new Hider();
    BaseClass b2 = h;
    h.Foo();                           // Hider.Foo
    b2.Foo();                          // BaseClass.Foo

    GetType() 和 typeof

    using System;
    
    public class Point {public int X, Y;}
    
    class Test
    {
      static void Main()
      {
        Point p = new Point();
        Console.WriteLine (p.GetType().Name);             // Point
        Console.WriteLine (typeof (Point).Name);          // Point
        Console.WriteLine (p.GetType() == typeof(Point)); // True
        Console.WriteLine (p.X.GetType().Name);           // Int32
        Console.WriteLine (p.Y.GetType().FullName);       // System.Int32
      }
    }

    显式接口实现:

    interface I1 { void Foo(); }
    interface I2 { int Foo(); }
    
    public class Widget : I1, I2
    {
      public void Foo ()
      {
        Console.WriteLine ("Widget's implementation of I1.Foo");
      }
    
      int I2.Foo ()
      {
        Console.WriteLine ("Widget's implementation of I2.Foo");
        return 42;
      }
    }
    Widget w = new Widget();
    w.Foo();                      // Widget's implementation of I1.Foo
    ((I1)w).Foo();                // Widget's implementation of I1.Foo 
    ((I2)w).Foo();                // Widget's implementation of I2.Foo

    虚拟地实现接口成员:

    public interface IUndoable { void Undo(); }
    
    public class TextBox : IUndoable
    {
      public virtual void Undo()
      {
         Console.WriteLine ("TextBox.Undo");
      }
    }
    
    public class RichTextBox : TextBox
    {
      public override void Undo()
      {
        Console.WriteLine ("RichTextBox.Undo");
      }
    }
    RichTextBox r = new RichTextBox();
    r.Undo();                          // RichTextBox.Undo
    ((IUndoable)r).Undo();             // RichTextBox.Undo
    ((TextBox)r).Undo();               // RichTextBox.Undo

    在子类中重新实现一个接口:

    public interface IUndoable { void Undo(); }
    
    public class TextBox : IUndoable
    {
      void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
    }
    
    public class RichTextBox : TextBox, IUndoable
    {
      public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
    }
    RichTextBox r = new RichTextBox();
    r.Undo();                 // RichTextBox.Undo      Case 1
    ((IUndoable)r).Undo();    // RichTextBox.Undo      Case 2
    public class TextBox : IUndoable
    {
      public void Undo() { Console.WriteLine ("TextBox.Undo"); }
    }
    RichTextBox r = new RichTextBox();
    r.Undo();                 // RichTextBox.Undo      Case 1
    ((IUndoable)r).Undo();    // RichTextBox.Undo      Case 2
    ((TextBox)r).Undo();      // TextBox.Undo          Case 3

    替代接口重新实现:

    public class TextBox : IUndoable
    {
      void IUndoable.Undo()         { Undo(); }   // Calls method below
      protected virtual void Undo() { Console.WriteLine ("TextBox.Undo"); }
    }
    
    public class RichTextBox : TextBox
    {
      protected override void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
    }

    Flags enums枚举:

    [Flags]
    public enum BorderSides { Left=1, Right=2, Top=4, Bottom=8 }
    
    BorderSides leftRight = BorderSides.Left | BorderSides.Right;
    
    if ((leftRight & BorderSides.Left) != 0)
       System.Console.WriteLine ("Includes Left");   // Includes Left
    
    string formatted = leftRight.ToString();   // "Left, Right"
    
    BorderSides s = BorderSides.Left;
    s |= BorderSides.Right;
    Console.WriteLine (s == leftRight);   // True
    
    s ^= BorderSides.Right;               // Toggles BorderSides.Right
    Console.WriteLine (s);                // Left  

    Enum枚举类型安全问题:

    static bool IsFlagDefined (Enum e)
    {
      decimal d;
      return ! decimal.TryParse(e.ToString(), out d);
    }
    
    [Flags]
    public enum BorderSides { Left=1, Right=2, Top=4, Bottom=8 }
    
    static void Main()
    {
      for (int i = 0; i <= 16; i++)
      {
        BorderSides side = (BorderSides)i;
        Console.WriteLine (IsFlagDefined (side) + " " + side);
      }
    }

    泛型:

    public class Stack<T>
    {
      int position;
      T[] data = new T[100];
      public void Push (T obj)        { data[position++] = obj;  }
      public T Pop ()                 { return data[--position]; }
    }
    Stack<int> stack = new Stack<int>(); 
    stack.Push(5);
    stack.Push(10);
    int x = stack.Pop();

    泛方法:

    static void Swap<T> (ref T a, ref T b)
    {
      T temp = b;
      a = b;
      b = temp;
    }

    默认泛值:

    static void Zap<T> (T[] array)
    {
      for (int i = 0; i < array.Length; i++)
        array[i] = default(T);
    }

    约束:

    static T Max <T> (T a, T b) where T : IComparable<T>
    {
      return a.CompareTo (b) > 0 ? a : b;
    }
    static void Initialize<T> (T[] array) where T : new()
    {
      for (int i = 0; i < array.Length; i++)
        array[i] = new T(); 
    }
    class Stack<T>
    {
      Stack<U> FilteredStack<U>() where U : T {...}
    }

    泛型和协方差:

    class Animal {}
    class Bear : Animal {}
    public class ZooCleaner
    {
      public static void Wash<T> (Stack<T> animals) where T : Animal {}
    }
    Stack<Bear> bears = new Stack<Bear>();
    ZooCleaner.Wash (bears);

    自引用泛型声明:

    interface IEquatable<T> { bool Equals (T obj); }
    
    public class Balloon : IEquatable<Balloon>
    {
      string color;
      int cc;
    
      public bool Equals (Balloon b)
      {
        if (b == null) return false;
        return b.color == color && b.cc == cc;
      }
    }

    泛型类型中的静态数据唯一:

    public class Bob<T> { public static int Count; }
    
    class Test
    {
      static void Main()
      {
        Console.WriteLine (++Bob<int>.Count);     // 1
        Console.WriteLine (++Bob<int>.Count);     // 2
        Console.WriteLine (++Bob<string>.Count);  // 1
        Console.WriteLine (++Bob<object>.Count);  // 1
      }
    }

    对象初始化:

    List<int> list = new List<int> {1, 2, 3};
  • 相关阅读:
    5000 端口 转发
    程序的运行环境=内存+运行库+系统调用
    日志异步落库
    malloc分配的空间是连续的吗?
    PE/ELF文件里面存的是什么呢?
    [Python]编码声明:是coding:utf-8还是coding=utf-8呢
    基于可执行代码的缓冲区溢出检测模型
    SU Demos-06Selecting Traces
    SU Demos-05Sorting Traces-03susorty
    SU Demos-05Sorting Traces-02Demos
  • 原文地址:https://www.cnblogs.com/yangzhenping/p/3345338.html
Copyright © 2011-2022 走看看