Сайты
Рекомендации по разработке библиотеки классов
Шаблоны
public class Dictionary<KeyType, ValType> where
KeyType : IComparable,
KeyType : IEnumerable,
ValType : Customer
{
   public void Add(KeyType key, ValType val)
   {
      ...
      switch(key.CompareTo(x))
      {
      }
      ...
   }
}

Stack<int> stackOne = new Stack<int>();

Делегаты
Статический обработчик
public class MyForm
{
   ListBox listBox;
   TextBox textBox;
   Button button;

   	public MyForm()
   	{
	listBox = new ListBox(...);
	textBox = new TextBox(...);
	button = new Button(...);
	button.Click += new EventHandler(AddClick);
	}

	void AddClick(object sender, EventArgs e)
   	{
      listBox.Items.Add(textBox.Text);
   	}
}
Динамический обработчик
Proba2;

public class MyForm
{
	public void Hook()
	{
		System.Reflection.Assembly a2;
		System.Reflection.EventInfo iv;
		System.Delegate dg;
		
		a2= System.Reflection.Assembly.LoadFrom("c:\\prog\\vc#\\proba4\\bin\\debug\\proba4.dll");
		object cnt= a2.CreateInstance("Proba4.UserControl1");
		this.Controls.Add((System.Windows.Forms.Control)cnt);

		iv = cnt.GetType().GetEvent("OkClick");
		dg = System.Delegate.CreateDelegate(iv.EventHandlerType,this,"HookEvent");
		iv.AddEventHandler(cnt,dg);
	}

	public void HookEvent(String s)
	{
		System.Windows.Forms.MessageBox.Show(s);
	}
	
}
Proba4;

	public delegate void OkClick_Event(String s);   

	public class UserControl1 : System.Windows.Forms.UserControl
	{
		public event OkClick_Event OkClick;
		
		public void Load()
		{
			if( OkClick != null )
				OkClick(this.textBox1.Text);
		}
	}
Индексаторы

Формально синтаксис определения индексатора таков: [атрибуты] [модификаторы] тип this [список-формальных-параметров]{set get} Или если это индексатор в интерфейсе то таков: [атрибуты] [модификаторы] тип интерфейс. this [список-формальных-параметров]{set get} Где:

  • атрибуты - дополнительная информация об индексаторе. Наиболее значимым для индексаторов является атрибут Name. Задание Name позволяет дать имя индексатору для того чтобы его могли использовать другие языки не поддерживающие индексаторы. По умолчанию все индексаторы вашего класса имеют Name равный Item.
  • модификаторы - модификаторы доступа и директивы. К индексатору применимы почти все стандартные директивы C#. Он может быть скрыт, перегружен, сделан виртуальным, но есть одно исключение, индексатор не может быть static.
  • список-формальных-параметров - указывает параметры, посредством которых осуществляется индексация. Передается в get и set. Get и set используются в индексаторе так же как в свойствах. Get используется для вычисления индексатора по заданному списку-формальных-параметров а set для изменения индексатора. Set получает в качестве дополнительного параметра value того же типа что и индексатор.
Следует отметить, что доступ к индексатору осуществляется посредством сигнатуры, в отличие от свойства доступ к которому осуществляется посредство имени. Сигнатурой индексатора считается число и тип формальных параметров. Тип самого индексатора и имена параметров в сигнатуру не входят. Естественно в классе не может быть двух индексаторов с одинаковой сигнатурой. К тому же индексатор не считается переменной и не может быть передан в качестве ref или out параметра. Вот пример простейшего класса использующего индексатор.
public class SampleIndexerClass {

  private int[] innerArray =   new int[10]; 
  
  public int  this [int Index] 
  { get { if ((Index  < 0) || (Index  > 10)) 
	  		throw  new ArgumentOutOfRangeException(); 
		return innerArray[Index];
      } 
	 set
    	{ if ((Index < 0)  || (Index >  10))
	        throw new ArgumentOutOfRangeException();
     	 innerArray[Index] = value;
    }
  }
}
Индексаторы и foreach
Для класса, который ведет себя как массив уместно иметь возможность перечисления всех его элементов. Традиционно это делается с помощью конструкции foreach. Но в случае класса имеющего индексатор эта конструкция просто так работать не будет. Для использования foreach класс должен поддерживать интерфейс IEnumerable (namespace System.Collections). IEnumerable содержит только один метод GetEnumerator(), возвращающий интерфейс IEnumerator, используемый для реализации перечисления. Интерфейс IEnumerator может быть реализован как самим классом, так и отдельным внутренним класом. Последнее предпочтительнее, так как несколько упрощает класс выступающий в роли коллекции. Теперь можно расширить приведенный выше пример для использования foreach.
using System;
using System.Collections;

public class SampleIndexerClass: IEnumerable {
  private int[] innerArray = new int[10];

  public int this [int Index] {
    get {
      if ((Index < 0) || (Index > 10))
        throw new ArgumentOutOfRangeException();
      return innerArray[Index];
    }
    set {
      if ((Index < 0) || (Index > 10))
        throw new ArgumentOutOfRangeException();
      innerArray[Index] = value;
    }
  }

  public IEnumerator GetEnumerator() {
    return (IEnumerator) new SampleIndexerClassEnumerator(this);
  }

  public class SampleIndexerClassEnumerator: IEnumerator {
    private int curPosition = -1;
    private SampleIndexerClass target;

    public SampleIndexerClassEnumerator(SampleIndexerClass t) {
      this.target = t;
    }

    public bool MoveNext() {
      curPosition++;
      return (curPosition < 10);
    }

    public void Reset() {
      curPosition = -1;
    }

    public object Current {
      get {
        return target[curPosition];
      }
    }
  }
}

public class AppMain {

  public static void Main() {
    int i;
    SampleIndexerClass sample = new SampleIndexerClass();
    for (i=0;i<10;i++)
    sample[i] = i;
    foreach(int j in sample)
    Console.WriteLine(j);
  }
}
Insensitive Hashtable
IHashCodeProvider hcp= new CaseInsensitiveHashCodeProvider();
IComparer comparer= new CaseInsensitiveComparer();	
m_mapping= new Hashtable( hcp, comparer );
Enum
 [Flags] public enum RowActionType { 
atEnter = 0x0001, 
atInsert = 0x0002, 
atDelete = 0x0004, 
atSelect = 0x0008 }
Картинка из Assembly
public static void RenderImage ( string assembly , string image , HttpContext context )
{
      Assembly   resourceAssem = Assembly.Load ( assembly ) ;

      // Получаем ресурс
      using ( Stream   imageStream = resourceAssem.GetManifestResourceStream ( image ) )
      {
         // И если все OK, выполняем контрольное считывание
         using ( System.Drawing.Image theImage =
               System.Drawing.Image.FromStream ( imageStream ) )
            response.ContentType = "image/gif" ;
            theImage.Save ( context.Response.OutputStream , ImageFormat.Gif ) ;
      }
}
Activator
String ClassName = "Royo.Plugins.MyCustomPlugin, MyCustomPlugin"
IPlugin plugin =  (IPlugin )Activator.CreateInstance(Type.GetType(ClassName));
Обработка денег (money.zip)
Object Serialization
/*****************************************
Example #1: Object Serialization
******************************************/
using System;
using System.IO;

[Serializable]   // Set attribute for serialization
class Car
	{
	private string mName;
	public Car(string name) { mName=name; }
	public string GetName() { return mName; }
	}

class TestMain
	{
	static void Main()
		{
		Car honda=new Car("Honda");  // Create a car object;

		Stream output=new FileStream("c:/test.bin",FileMode.Create,FileAccess.Write);
		output=new BufferedStream(output,512*8);  // Buffer the stream.

		// Binary Formater object
		System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater=
				new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
		
		formater.Serialize(output,honda);

		output.Close();		
		}
	}



/*********************************************
Example #2: Reading back the serialized object
**********************************************/
using System;
using System.IO;

[Serializable]   // Set attribute for serialization
class Car
	{
	private string mName;
	public Car(string name) { mName=name; }
	public string GetName() { return mName; }
	}

class TestMain
	{
	static void Main()
		{
		Car honda;

		Stream input=new FileStream("c:/test.bin",FileMode.Open,FileAccess.Read);
		input=new BufferedStream(output,512*8);  // Buffer the stream.

		// Binary Formater object
		System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater=
				new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
		
		honda=(Car)formater.Deserialize(input);

		Console.WriteLine("Honda Name: "+honda.GetName());

		input.Close();		
		}
	}


/*********************************************
Example #3: Serialize a Queue to a file
**********************************************/
using System;
using System.IO;
using System.Collections;

class TestMain
	{
	static void Main()
		{
		Stream output=new FileStream("c:/test.bin",FileMode.Create,FileAccess.Write);
		output=new BufferedStream(output,512*8);  // Buffer the stream.

		// Binary Formater object
		System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater=
				new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
		
		Queue queue=new Queue();

		for(int i=1;i<2000;++i)
			{
			queue.Enqueue(i);
			queue.Enqueue("This is a string: "+i);
			}

		// Serialize Queue to File
		formater.Serialize(output,queue);
		
		output.Close();		
		}
	}



/*********************************************
Example #4: Deserialize a Queue from a file
**********************************************/
using System;
using System.IO;
using System.Collections;

class TestMain
	{
	static void Main()
		{
		Stream input=new FileStream("c:/test.bin",FileMode.Open,FileAccess.Read);
		input=new BufferedStream(input,512*8);  // Buffer the stream.

		// Binary Formater object
		System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater=
				new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
		
		Queue queue;

		// Serialize Queue to File
		queue=(Queue)formater.Deserialize(input);
		
		input.Close();		

		while(queue.Count>0)
			{  Console.WriteLine("Item "+queue.Dequeue() ); }
		}
	}



/*****************************************
Example #5: Object Serialization using XML
You must reference the DLL System.Runtime.Serialization.Formatters.Soap.dll
******************************************/
using System;
using System.IO;

[Serializable]   // Set attribute for serialization
class Car
{
	private string mName;
	public Car(string name) { mName=name; }
	public string GetName() { return mName; }
}

class TestMain
{
	static void Main()
	{
		Car honda=new Car("Honda");  // Create a car object;

		Stream output=new FileStream("c:/test.bin",FileMode.Create,FileAccess.Write);
		output=new BufferedStream(output,512*8);  // Buffer the stream.

		// Soap.So Formater object
		System.Runtime.Serialization.Formatters.Soap.SoapFormatter formater
				=new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
		
		formater.Serialize(output,honda);

		output.Close();		
	}
}



/*****************************************
Example #6: Object Deserialization using XML
You must reference the DLL System.Runtime.Serialization.Formatters.Soap.dll
******************************************/
using System;
using System.IO;

[Serializable]   // Set attribute for serialization
class Car
	{
	private string mName;
	public Car(string name) { mName=name; }
	public string GetName() { return mName; }
	}

class TestMain
	{
	static void Main()
		{
		Car honda=new Car("Honda");  // Create a car object;

		Stream input=new FileStream("c:/test.bin",FileMode.Open,FileAccess.Read);
		input=new BufferedStream(input,512*8);  // Buffer the stream.

		// Soap.So Formater object
		System.Runtime.Serialization.Formatters.Soap.SoapFormatter formater
				=new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
		
		honda=(Car)formater.Deserialize(input);

		input.Close();		

		Console.WriteLine("Honda: "+honda.GetName() );
		}
	}



/*****************************************
Example #7: Object Serialization of Queue
** Serial File is 229K
******************************************/
using System;
using System.IO;
using System.Collections;

class TestMain
	{
	static void Main()
		{
		Stream output=new FileStream("c:/test.bin",FileMode.Create,FileAccess.Write);
		output=new BufferedStream(output,512*8);  // Buffer the stream.

		// Binary Formater object
		System.Runtime.Serialization.Formatters.Soap.SoapFormatter formater=
			new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
		
		Queue queue=new Queue();

		for(int i=1;i<2000;++i)
			{
			queue.Enqueue(i);
			queue.Enqueue("This is a string: "+i);
			}

		// Serialize Queue to File
		formater.Serialize(output,queue);
		
		output.Close();		
		}
	}


/*****************************************
Example #8: Object Deserialization of Queue
******************************************/

using System;
using System.IO;
using System.Collections;

class TestMain
	{
	static void Main()
		{
		Stream input=new FileStream("c:/test.bin",FileMode.Open,FileAccess.Read);
		input=new BufferedStream(input,512*8);  // Buffer the stream.

		// XML Formater object
		System.Runtime.Serialization.Formatters.Soap.SoapFormatter formater=
			new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
		
		Queue queue;

		// Serialize Queue to File
		queue=(Queue)formater.Deserialize(input);
		
		input.Close();		

		while(queue.Count>0)
			{  Console.WriteLine("Item "+queue.Dequeue() ); }
		}
	}



///////////////////////////////////////////////////////////////////////////
/// Soap File
//////////////////////////////////////////////////////////////////////////
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
	SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
	xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections">

<SOAP-ENV:Body>
<a1:Queue id="ref-1">
<_array href="#ref-2"/>
<_head>0</_head>
<_tail>3998</_tail>
<_size>3998</_size>
<_growFactor>200</_growFactor>
<_version>4005</_version>
</a1:Queue>
<SOAP-ENC:Array id="ref-2" SOAP-ENC:arrayType="xsd:ur-type[4096]">
<item xsi:type="xsd:int">1</item>
<item id="ref-3" xsi:type="SOAP-ENC:string">This is a string: 1</item>
<item xsi:type="xsd:int">2</item>
<item id="ref-4" xsi:type="SOAP-ENC:string">This is a string: 2</item>
<item xsi:type="xsd:int">3</item>
<item id="ref-5" xsi:type="SOAP-ENC:string">This is a string: 3</item>
<item xsi:type="xsd:int">4</item>
<item id="ref-6" xsi:type="SOAP-ENC:string">This is a string: 4</item>
<item xsi:type="xsd:int">5</item>
<item id="ref-7" xsi:type="SOAP-ENC:string">This is a string: 5</item>
<item xsi:type="xsd:int">6</item>
<item id="ref-8" xsi:type="SOAP-ENC:string">This is a string: 6</item>
<item xsi:type="xsd:int">7</item>
<item id="ref-9" xsi:type="SOAP-ENC:string">This is a string: 7</item>
....
Hosted by uCoz