PDA

View Full Version : آموزش: interface های مهم در C#‎‎‎‎‎‎‎‎



cardano7
یک شنبه 30 خرداد 1389, 21:01 عصر
سلام دوستان خوب من،
راستش از یک طرف احساس می کنم interface ها ابزارهای مهمی در برنامه نویسی C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎ هستند(عذر می خوام اگر C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ و دات نت رو از هم تفکیک نمی کنم) و دونستن اونا دید ما رو نسبت به C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎ خیلی تغییر میده. ولی در آموزش اونا کوتاهی میشه. خیلی وقت ها دوستان خیلی از مثال های حرفه یی رو متوجه نمیشند و دلیلش اینه که اونا پر از interface هستند اما دوستان از این interface ها سر در نمیارند. حذف interface از C#‎‎‎‎‎‎‎‎‎‎‎‎ یعنی حذف بخش عمده یی از این زبان.
خیلی وقت ها کاستی های زیادی وجود داره اما خودمون رومون نمیشه اونا رو مطرح کنیم. من احساس کردم از interface ها زیاد خوشم نمیاد. اما یک مدت هست که به این نتیجه رسیدم که وقتی از مطلبی خوشمون نمیاد به جای فرار از اون بهتره که باهاش رو به رو شد و عمدا به طرفش رفت. تا حالا خیلی مطالب رو هدف گرفتم و یکی از اونا interface هاست. احساس می کنم که این وب سایت هم در زمینه ی interface ضعیف هست. چه در مورد خود مفهوم interface و چه در مورد interface های مهم و رایج در C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎ . برای همین تصمیم گرفتم روی interface ها تمرکز کنم همه ی مطالب پراکنده رو یک جا جمع کنم و برای این کار نیاز به کمک دیگر دوستان هم هست. مسلما خودم هم در تاپیک خیلی چیزها یاد خواهم گرفت و امیدوارم برای ارتقای سطح علمی دوستان در زمینه ی interface ، تاپیک خوبی باشه.

پس این تاپیک رو فقط به آموزش interface های مهم C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎ نسبت میدیم.
گاهی از مثال های MSDN استفاده می کنیم. اگه کسی مثال بهتری سراغ داره به ما خبر بده.
من پست های مختلفی را اضافه می کنم و به اونا لینک میدم. اگه شما هم پست های خوبی بگذارید و به اونا لینک بدیم خیلی عالی میشه. پس هر پست مفیدی را هر جا سراغ دارید به من اطلاع بدید که لینکش رو اضافه کنم.
نظرات و پیشنهادات خودتون رو برای بهتر شدن تاپیک سراپا گوشم.
اول لیست اولیه موارد را قرار میدم بعد یکم یکم جای خالی اونا رو پر می کنم. همچنین موارد جدید رو هم اضافه می کنم.
یادمون باشه که فقط interface های مهم رو بررسی کنیم و نه اینکه دیکشنری وار به تمام interface های C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ نگاه کنیم.

امیدورام interface ها رو به دید دوستان صمیمی نگاه کنید!



interface چیست؟
برخی لینک ها:




CodeProject (http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx)
Wikipedia (http://en.wikipedia.org/wiki/Interface_%28object-oriented_programming%29)


اینها نظرات دوستان هستند که من در اینجا لینکشون رو قرار می دهم:


moharrami (http://barnamenevis.org/forum/showpost.php?p=1055531&postcount=7)



interface های System

ICloneable (http://barnamenevis.org/forum/showthread.php?p=1059024#post1059024)
IComparable (http://www.barnamenevis.org/forum/showthread.php?p=1019508#post1019508)
IConvertible (http://www.barnamenevis.org/forum/showpost.php?p=1021517&postcount=4)
ICustomFormatter
IDisposable (http://www.barnamenevis.org/forum/showthread.php?p=1019938#post1019938)
IEquatable (http://barnamenevis.org/forum/showthread.php?p=1055282#post1055282)
IFormattable (http://barnamenevis.org/forum/showthread.php?p=1057777#post1057777)
IObservable
IObserver
IAsyncResult (http://barnamenevis.org/forum/showthread.php?p=1061839#post1061839)


interface های System.Collections

ICollection (http://barnamenevis.org/forum/showthread.php?p=1094651#post1094651)
IComparer
IDictionary (http://barnamenevis.org/forum/showthread.php?p=1129109#post1129109)
IDictionaryEnumerator
IEnumerable
IEnumerator
IList


interface های System.Windows.Forms

IButtonControl (http://barnamenevis.org/forum/showpost.php?p=1140365&postcount=16)
IContainerControl

cardano7
یک شنبه 30 خرداد 1389, 22:42 عصر
System.IComparable
این interface شما رو موظف می کنه که یک متد به نام CompareTo به کلاستون اضافه کنید.
public int CompareTo(object obj)
{
....
}

با این متد میشه همیشه دو شی از اون کلاس رو با هم مقایسه کرد.
وجود چنین متدی برای انجام بسیاری از عملیات همچون sort کردن، کاملا حیاتی است.

اگر من کلاس خودم را این چنین تعریف کنم:
public class myClass : IComparable
{
...

public int CompareTo(object obj)
{
....
}
}

و بعد یک Collection از اون را بسازم:

ArrayList<myClass> myInstance = new ArrayList<myClass>();

حالا می تونم برای مرتب سازی اون Collection متد Sort را صدا بزنم.
این روش برای Array و ArrayList و List کار میده.

اینجاست که آدم به زیبایی interface ها پی می بره.

این هم نمونه مثال خود MSDN هست(هرچند به نظر می تونست بهتر از اینها هم باشه):


using System;
using System.Collections;

public class Temperature : IComparable
{
// The temperature value
protected double temperatureF;

public int CompareTo(object obj) {
Temperature otherTemperature = obj as Temperature;
if (otherTemperature != null)
return this.temperatureF.CompareTo(otherTemperature.tempe ratureF);
else
throw new ArgumentException("Object is not a Temperature");
}

public double Fahrenheit
{
get
{
return this.temperatureF;
}
set {
this.temperatureF = value;
}
}

public double Celsius
{
get
{
return (this.temperatureF - 32) * (5.0/9);
}
set
{
this.temperatureF = (value * 9.0/5) + 32;
}
}
}

public class CompareTemperatures
{
public static void Main()
{
ArrayList temperatures = new ArrayList();
// Initialize random number generator.
Random rnd = new Random();

// Generate 10 temperatures between 0 and 100 randomly.
for (int ctr = 1; ctr <= 10; ctr++)
{
int degrees = rnd.Next(0, 100);
Temperature temp = new Temperature();
temp.Fahrenheit = degrees;
temperatures.Add(temp);
}

// Sort ArrayList.
temperatures.Sort();

foreach (Temperature temp in temperatures)
Console.WriteLine(temp.Fahrenheit);

}
}
// The example displays the following output to the console (individual
// values may vary because they are randomly generated):
// 2
// 7
// 16
// 17
// 31
// 37
// 58
// 66
// 72
// 95

cardano7
دوشنبه 31 خرداد 1389, 12:29 عصر
System.IDisposable
این interface شما رو موظف می کنه که یک متد به نام Dispose به کلاستون اضافه کنید.
public void Dispose()
{
....
}

هدف از این کار release کردن unmanaged resources هست.
اگر کلاسی این interface را پیاده سازی کنه، قابلیت این رو داره که در بلوک using به کار گرفته بشه. در غیر این صورت کامپایلر اجازه ی این کار رو نمیده.

این دو نمونه کلاس رو نگاه کنید:
class myClass1 : IDisposable
{
...
public void Dispose()
{
...
}
}

class myClass2
{
...
public void Dispose()
{
...
}
}

هر دو شبیه هم هستند و تنها تفاوتشون اینه که myClass2 بر خلاف myClass1 از IDisposable ارث بری نکرده.(گرچه هر دو متد Dispose را دارا هستند)
حالا ببینیم عاقبتشون چی میشه. به هر دو using زیر نگاه کنید:

using (myClass1 mc1 = new myClass1())
{
....
}

using (myClass2 mc2 = new myClass2())
{
...
}

اولی بعد از اجرا ی بلوک، متد Dispose رو صدا می زنه.
اما دومی کارش به اینجاها نمیکشه. همون اول کامپایلر با این error متوقفش می کنه:

type used in a using statement must be implicitly convertible to 'System.IDisposable'البته میشه آزادسازی دستی توسط متد Dispose را در بلوک های finally هم مشاهده کرد.

در زیر لیستی از کلاس هایی را می بینید که این interface را پیاده سازی کرده اند. چه کلاس های دیگری را هم در اطرافتون می شناسید دارید که این interface رو پیاده سازی کرده باشند؟




BinaryReader
BinaryWriter
Brush
Component
Container
Control
Cursor
Font
Graphics
Icon
Image
Matrix
MessageEnumerator
OdbcDataReader
OdbcTransaction
OleDbDataReader
OleDbTransaction
OracleDataReader
OracleTransaction
Pen
Region
Socket
SqlCeCommand
SqlCeConnection
SqlCeDataReader
SqlCeEngine
SqlCeRemoteDataAccess
SqlCeReplication
SqlCeTransaction
SqlDataReader
SqlTransaction
Stream
TcpClient
TextReader
TextWriter
Timer
UdpClient
WebResponse



--------------------------------------
این هم جواب هایی که برخی از دوستان دادند:
http://barnamenevis.org/forum/showpost.php?p=1055317&postcount=6

cardano7
سه شنبه 01 تیر 1389, 20:11 عصر
System.IConvertible
این interface شما رو موظف می کنه که نه یک متد بلکه یک کوه متد به کلاستون اضافه کنید:

public TypeCode GetTypeCode()

public bool ToBoolean(IFormatProvider provider)

public byte ToByte(IFormatProvider provider)

public char ToChar(IFormatProvider provider)

public DateTime ToDateTime(IFormatProvider provider)

public decimal ToDecimal(IFormatProvider provider)

public double ToDouble(IFormatProvider provider)

public short ToInt16(IFormatProvider provider)

public int ToInt32(IFormatProvider provider)

public long ToInt64(IFormatProvider provider)

public sbyte ToSByte(IFormatProvider provider)

public float ToSingle(IFormatProvider provider)

public string ToString(IFormatProvider provider)

public object ToType(Type conversionType, IFormatProvider provider)

public ushort ToUInt16(IFormatProvider provider)

public uint ToUInt32(IFormatProvider provider)

public ulong ToUInt64(IFormatProvider provider)

در بین اونا دو تا از متدها با دیگران متفاوتند: GetTypeCode و ToType
بقیه شبیه هم به نظر می رسند.

هدف از این interface اینه که کلاس رو موظف کنه که برای user امکاناتی رو برای تبدیل object های ساخته شده از این کلاس رو به نوع های اولیه فراهم کنه:

Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char, and String.
مثلا ToInt32 وظیفه داره که شی را به نوع int، کانورت کنه.

مزیت بارز این کار اینه که وقتی شما این interface رو پیاده سازی می کنید، اشیا از نوع کلاس شما می تونند توسط System.Convert معروف به انواع اولیه نظیر رشته و عدد و ... تبدیل بشند.

در اینجا چون تعداد توابع زیاده فرق پیاده سازی Explicit و غیر Explicit بیشتر مشخصه.
در ضمن از پارامتر IFormatProvider هم نترسید. اگه ازش خوشتون نمیاد نیازی نیست ازش استفده کنید. بگذارید دکوری باقی بمونه.

هر چند مثال های MSDN همیشه خوب نیستند اما این یکی جالبه. یک کلاس ساخته که اعداد مختلط رو نگه می داره و به ما اجازه میده اون رو به نوع های مختلف Convert کنیم:

using System;

namespace ConsoleApplication2
{

/// Class that implements IConvertible
class Complex : IConvertible
{
double x;
double y;

public Complex(double x, double y)
{
this.x = x;
this.y = y;
}

public TypeCode GetTypeCode()
{
return TypeCode.Object;
}

bool IConvertible.ToBoolean(IFormatProvider provider)
{
if( (x != 0.0) || (y != 0.0) )
return true;
else
return false;
}

double GetDoubleValue()
{
return Math.Sqrt(x*x + y*y);
}

byte IConvertible.ToByte(IFormatProvider provider)
{
return Convert.ToByte(GetDoubleValue());
}

char IConvertible.ToChar(IFormatProvider provider)
{
return Convert.ToChar(GetDoubleValue());
}

DateTime IConvertible.ToDateTime(IFormatProvider provider)
{
return Convert.ToDateTime(GetDoubleValue());
}

decimal IConvertible.ToDecimal(IFormatProvider provider)
{
return Convert.ToDecimal(GetDoubleValue());
}

double IConvertible.ToDouble(IFormatProvider provider)
{
return GetDoubleValue();
}

short IConvertible.ToInt16(IFormatProvider provider)
{
return Convert.ToInt16(GetDoubleValue());
}

int IConvertible.ToInt32(IFormatProvider provider)
{
return Convert.ToInt32(GetDoubleValue());
}

long IConvertible.ToInt64(IFormatProvider provider)
{
return Convert.ToInt64(GetDoubleValue());
}

sbyte IConvertible.ToSByte(IFormatProvider provider)
{
return Convert.ToSByte(GetDoubleValue());
}

float IConvertible.ToSingle(IFormatProvider provider)
{
return Convert.ToSingle(GetDoubleValue());
}

string IConvertible.ToString(IFormatProvider provider)
{
return String.Format("({0}, {1})", x, y);
}

object IConvertible.ToType(Type conversionType, IFormatProvider provider)
{
return Convert.ChangeType(GetDoubleValue(),conversionType );
}

ushort IConvertible.ToUInt16(IFormatProvider provider)
{
return Convert.ToUInt16(GetDoubleValue());
}

uint IConvertible.ToUInt32(IFormatProvider provider)
{
return Convert.ToUInt32(GetDoubleValue());
}

ulong IConvertible.ToUInt64(IFormatProvider provider)
{
return Convert.ToUInt64(GetDoubleValue());
}

}

/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{

Complex testComplex = new Complex(4,7);

WriteObjectInfo(testComplex);
WriteObjectInfo(Convert.ToBoolean(testComplex));
WriteObjectInfo(Convert.ToDecimal(testComplex));
WriteObjectInfo(Convert.ToString(testComplex));

}

static void WriteObjectInfo(object testObject)
{
TypeCode typeCode = Type.GetTypeCode( testObject.GetType() );

switch( typeCode )
{
case TypeCode.Boolean:
Console.WriteLine("Boolean: {0}", testObject);
break;

case TypeCode.Double:
Console.WriteLine("Double: {0}", testObject);
break;

default:
Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
break;
}
}
}
}



یک حرف هایی هم در مورد استثنائات مربوط به این interface گفته شده که حوصله ندارم ترجمه کنم. دوست داشتید به خود MSDN رجوع کنید:
http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx

cardano7
دوشنبه 11 مرداد 1389, 19:39 عصر
System.IEquatable
این interface شما رو موظف می کنه که یک متد به نام Equals را به کلاستون اضافه کنید. وظیفه ی این متد اینه که مقایسه کنه که آیا شی شما با شی دیگری برابر هست یا خیر. این interface ناخودآگاه ما رو به یاد اینترفیس System.IComparableمیندازه.
مزیت این اینترفیس اینه که به دیگر کلاس ها اجازه ی جستجو کردن اعضای از جنس این کلاس را به شکل دلخواه ما میده. برخی کلاس ها مانند List یا ArrayList به واسطه ی همین interface در بین اعضای لیست خود جستجو می کنند. مثلا List<T>.Contains ، List<T>.IndexOf و List<T>.Remove برای جستجو به سراغ همین interface می روند.

در زیر نمونه کدی را در این مورد مشاهده می کنید:


public class Student:IEquatable<Student>
{
public string Name;
public string Course;
public float Score;

public Student(string Name,string Course,float Score)
{
this.Name = Name;
this.Course = Course;
this.Score = Score;
}

public bool Equals(Student other)
{
if (this.Name == other.Name)
return true;
else
return false;
}

public override bool Equals(object other)
{
if (other == null)
return false;
if (!(other is Student))
throw new InvalidCastException("The argument is not a Student object.");
else
return Equals(other as Student);
}

public override int GetHashCode()
{
return this.Name.GetHashCode();
}

public static bool operator ==(Student student1, Student student2)
{
return student1.Equals(student2);
}

public static bool operator !=(Student student1, Student student2)
{
return (!student1.Equals(student2));
}
}
این interface مسائل حاشیه ای زیاد داره.
یکی اینکه اگه یک Equal برای کلاس خودمون ساختیم، یکی هم برای مقایسه ی کلاس خودمون با object بسازیم. دیگری تعریق operator های == و =! هست. و مسئله ی سوم تعریف GetHashCode هست به خصوص برای دیکشنری ها(<Dictionary<TKey, TValue (http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)). برای بررسی دقیق تر موضوع می تونید به MSDN مراجعه کنید:
http://msdn.microsoft.com/en-us/library/ms131190.aspx

FastCode
دوشنبه 11 مرداد 1389, 20:32 عصر
در زیر لیستی از کلاس هایی را می بینید که این interface را پیاده سازی کرده اند. چه کلاس های دیگری را هم در اطرافتون می شناسید دارید که این interface رو پیاده سازی کرده باشند؟

این فقط 30 درصدشه.:کف:
Microsoft.Reporting.WinForms.AsyncWaitControl
Microsoft.Reporting.WinForms.ClientGDIRenderer
Microsoft.Reporting.WinForms.GdiContext
Microsoft.Reporting.WinForms.LocalReport
Microsoft.Reporting.WinForms.LocalReport+ReportRun timeSetupHandler
Microsoft.Reporting.WinForms.ReportHierarchy
Microsoft.Reporting.WinForms.ReportInfo
Microsoft.SqlServer.Management.Common.SqlConnectio nInfoWithConnection
Microsoft.SqlServer.Server.SmiConnection
Microsoft.SqlServer.Server.SmiEventStream
Microsoft.SqlServer.Server.SmiRecordBuffer
Microsoft.SqlServer.Server.SmiRequestExecutor
Microsoft.VisualBasic.FileIO.TextFieldParser
Microsoft.Win32.RegistryKey
System.ActivationContext
System.Activities.Debugger.StateManager
System.Activities.Statements.DurableTimerExtension
System.Activities.Statements.InteropEnvironment
System.Activities.Statements.InteropExecutor+Activ ityDefinitionResolution
System.Activities.Statements.InteropExecutor+Reset CurrentActivity
System.Activities.Statements.TimerTable
System.Activities.WorkflowDataContext
System.CodeDom.Compiler.TempFileCollection
System.Collections.Concurrent.BlockingCollection<T>
System.Collections.Concurrent.OrderablePartitioner<TSource>+EnumerableDropIndices<TSource>
System.Collections.Concurrent.Partitioner+DynamicP artitionerForIEnumerable<TSource>+InternalPartitionEnumerable<TSource>
System.Collections.Generic.IEnumerator<T>
System.Collections.Generic.SynchronizedReadOnlyCol lection<T>+EnumeratorAdapter<T>
System.Collections.ObjectModel.ObservableCollectio n<T>+SimpleMonitor<T>
System.ComponentModel.Design.DesignerTransaction
System.ComponentModel.Design.IDesigner
System.ComponentModel.Design.Serialization.Seriali zationStore
System.ComponentModel.Design.ServiceContainer
System.ComponentModel.EventHandlerList
System.ComponentModel.IComponent
System.ComponentModel.IContainer
System.ComponentModel.License
System.Data.IDataReader
System.Data.IDbCommand
System.Data.IDbConnection
System.Data.IDbTransaction
System.Data.OleDb.IDBInfoWrapper
System.Data.OleDb.IDBPropertiesWrapper
System.Data.OleDb.IDBSchemaRowsetWrapper
System.Data.OleDb.IOpenRowsetWrapper
System.Data.OleDb.ITransactionJoinWrapper
System.Data.OleDb.OleDbConnectionInternal
System.Data.SqlClient.SqlBulkCopy
System.Data.SqlClient.SqlDebugContext
System.Data.SqlClient.SqlInternalConnectionTds
System.Data.SqlTypes.SqlStreamChars
System.Deployment.Internal.Isolation.BLOB
System.Deployment.Internal.Isolation.Manifest.Asse mblyReferenceDependentAssemblyEntry
System.Deployment.Internal.Isolation.Manifest.Dire ctoryEntry
System.Deployment.Internal.Isolation.Manifest.File Entry
System.Deployment.Internal.Isolation.Manifest.Hash ElementEntry
System.Deployment.Internal.Isolation.Manifest.Meta dataSectionEntry
System.Deployment.Internal.Isolation.Manifest.MuiR esourceMapEntry
System.Deployment.Internal.Isolation.Manifest.MuiR esourceTypeIdIntEntry
System.Deployment.Internal.Isolation.Manifest.MuiR esourceTypeIdStringEntry
System.Deployment.Internal.Isolation.Manifest.Regi stryKeyEntry
System.Deployment.Internal.Isolation.Store+IPathLo ck
System.Deployment.Internal.Isolation.StoreTransact ion
System.Diagnostics.AsyncStreamReader
System.Diagnostics.Eventing.EventProvider
System.Diagnostics.Eventing.EventProviderBase
System.Diagnostics.Eventing.EventProviderDataStrea m
System.Diagnostics.Eventing.Reader.EventLogConfigu ration
System.Diagnostics.Eventing.Reader.EventLogPropert ySelector
System.Diagnostics.Eventing.Reader.EventLogReader
System.Diagnostics.Eventing.Reader.EventLogSession
System.Diagnostics.Eventing.Reader.EventLogWatcher
System.Diagnostics.Eventing.Reader.EventRecord
System.Diagnostics.Eventing.Reader.ProviderMetadat a
System.Diagnostics.EventLogInternal
System.Diagnostics.PerformanceData.CounterSet
System.Diagnostics.PerformanceData.CounterSetInsta nce
System.Diagnostics.PerformanceData.CounterSetInsta nceCounterDataSet
System.Diagnostics.TraceListener
System.Drawing.Brush
System.Drawing.BufferedGraphics
System.Drawing.BufferedGraphicsContext
System.Drawing.Drawing2D.CustomLineCap
System.Drawing.Drawing2D.GraphicsPath
System.Drawing.Drawing2D.GraphicsPathIterator
System.Drawing.Drawing2D.Matrix
System.Drawing.Font
System.Drawing.FontConverter+FontNameConverter
System.Drawing.FontFamily
System.Drawing.GraphicsContext
System.Drawing.Icon
System.Drawing.IDeviceContext
System.Drawing.Image
System.Drawing.Imaging.EncoderParameter
System.Drawing.Imaging.EncoderParameters
System.Drawing.Imaging.ImageAttributes
System.Drawing.Imaging.PropertyItemInternal
System.Drawing.Internal.WindowsRegion
System.Drawing.Pen
System.Drawing.Region
System.Drawing.StringFormat
System.Drawing.Text.FontCollection
System.IdentityModel.Claims.WindowsClaimSet
System.IdentityModel.Claims.X509CertificateClaimSe t
System.IdentityModel.Claims.X509Identity
System.IdentityModel.Policy.UnconditionalPolicy
System.IdentityModel.Selectors.X509SecurityTokenPr ovider
System.IdentityModel.Tokens.WindowsSecurityToken
System.IdentityModel.Tokens.X509SecurityToken
System.IO.BinaryReader
System.IO.BinaryWriter
System.IO.IsolatedStorage.IsolatedStorageFile
System.IO.MemoryMappedFiles.MemoryMappedFile
System.IO.MemoryMappedFiles.MemoryMappedView
System.IO.Stream
System.IO.TextReader
System.IO.TextWriter
System.IO.UnmanagedMemoryAccessor
System.Linq.Parallel.AsynchronousChannel<T>
System.Linq.Parallel.SortHelper<TInputOutput,TKey>
System.Net.HttpListener
System.Net.HttpListenerResponse
System.Net.IWebProxyFinder
System.Net.Mail.AlternateViewCollection
System.Net.Mail.AttachmentBase
System.Net.Mail.AttachmentCollection
System.Net.Mail.LinkedResourceCollection
System.Net.Mail.MailMessage
System.Net.Mail.SmtpClient
System.Net.Mime.MimePart
System.Net.NetworkAddressChangePolled
System.Net.ProxyChain
System.Net.RequestContextBase
System.Net.Sockets.Socket
System.Net.Sockets.SocketAsyncEventArgs
System.Net.Sockets.TcpClient
System.Net.Sockets.UdpClient
System.Net.TimerThread+Timer
System.Net.TlsStream
System.Net.WebResponse
System.Resources.IResourceReader
System.Resources.IResourceWriter
System.Resources.ResourceSet
System.Runtime.AsyncResult+TransactionSignalScope
System.Runtime.Diagnostics.DiagnosticsEventProvide r
System.Runtime.InputQueue<T>
System.Runtime.InteropServices.CriticalHandle
System.Runtime.InteropServices.SafeHandle
System.Runtime.MemoryFailPoint
System.Security.AccessControl.Privilege+TlsContent s
System.Security.Cryptography.AsymmetricAlgorithm
System.Security.Cryptography.BCryptHashAlgorithm
System.Security.Cryptography.CapiHashAlgorithm
System.Security.Cryptography.CngKey
System.Security.Cryptography.DeriveBytes
System.Security.Cryptography.ECDiffieHellmanPublic Key
System.Security.Cryptography.ICryptoTransform
System.Security.Cryptography.RandomNumberGenerator
System.Security.Cryptography.SymmetricAlgorithm
System.Security.Policy.Evidence+EvidenceLockHolder
System.Security.Policy.Evidence+EvidenceUpgradeLoc kHolder
System.Security.Principal.WindowsIdentity
System.Security.Principal.WindowsImpersonationCont ext
System.Security.SecureString
System.Security.SecurityContext
System.Security.SecurityContextSwitcher
System.ServiceModel.Activation.SharedMemory
System.ServiceModel.Administration.WbemProvider+Th readJob
System.ServiceModel.ChannelFactory
System.ServiceModel.Channels.AllowHelper+Registrat ionForAllow

moharrami
سه شنبه 12 مرداد 1389, 00:26 صبح
به نظر من اینترفیس ها رو میشه به برگه کلید در تصحیح پاسخ نامه های چهار گزینه ای تشبیه کرد. همون هایی که مصحح میزاره رو پاسخ نامه و تند تند جواب های درست رو علامته میزنه!
ما گاهی اشیائی داریم که از یه جنبه های شبیه هم اند ولی ذات اونها باهم فرق داره. میخوایم جدای این تفاوت ها از این شباهت استفاده کنیم بدون اینکه درگیر نوع و ساختار متفاوت این اشیا بیشم. به زبان ساده تر می خوایم برگه کلید رو روی شیء بزاریم و فقط اون چیزهایی رو که نیاز داریم ببینیم. برای این کار یه اینترفیس می نویسم و اون کلاسهایی رو که میخوایم این خصوصیت ها رو داشته باشند وارث قرار میدیم. در این شرایط این کلاس ها مجبور خواهند بود مفاد اینترفیس ما رو پیاده کنند. و ما میتونیم در یک مثلا متدی از این اینترفیس استفاده کنیم بدون اینکه برامون مهم باشه که شیء حاضر یک فرمه یا یک کلاسی که جدیدا نوشته شده و یا غیره. البته دلیل وجود و موارد استفاده اینترفیس ها بسیار بسیار بیشتر از اینه که دوستان و اساتید بحث رو بسط خواهند داد انشاءالله.

FastCode
سه شنبه 12 مرداد 1389, 00:28 صبح
به نظر من اینترفیس ها رو میشه به برگه کلید در تصحیح پاسخ نامه های چهار گزینه ای تشبیه کرد. همون هایی که مصحح میزاره رو پاسخ نامه و تند تند جواب های درست رو علامته میزنه!
ما گاهی اشیائی داریم که از یه جنبه های شبیه هم اند ولی ذات اونها باهم فرق داره. میخوایم جدای این تفاوت ها از این شباهت استفاده کنیم بدون اینکه درگیر نوع و ساختار متفاوت این اشیا بیشم. به زبان ساده تر می خوایم برگه کلید رو روی شیء بزاریم و فقط اون چیزهایی رو که نیاز داریم ببینیم. برای این کار یه اینترفیس می نویسم و اون کلاسهایی رو که میخوایم این خصوصیت ها رو داشته باشند وارث قرار میدیم. در این شرایط این کلاس ها مجبور خواهند بود مفاد اینترفیس ما رو پیاده کنند. و ما میتونیم در یک مثلا متدی از این اینترفیس استفاده کنیم بدون اینکه برامون مهم باشه که شیء حاضر یک فرمه یا یک کلاسی که جدیدا نوشته شده و یا غیره. البته دلیل وجود و موارد استفاده اینترفیس ها بسیار بسیار بیشتر از اینه که دوستان و اساتید بحث رو بسط خواهند داد انشاءالله.

0 نفر از یک نفر این پاسخ رو مفید ارزیابی کردند.
حذف شدن این امکان کار خودم بود.کاش اون vulnerability رو پیدا نمیکردم.

cardano7
پنج شنبه 14 مرداد 1389, 05:32 صبح
System.IFormattable
این interface یکی از قشنگ ترین اینترفیس هاست. هدف از این اینترفیس اجبار کلاس به این است که برای کاربران قابلیت فرمت بندی را در متد ToString قرار دهد. البته ما معمولا بیشتر به جای اینکه این اینترفیس را روی کلاس هامون اعمال کنیم، از کلاس هایی استفاده می کنیم که زیر نظارت این اینترفیس به ما امکاناتی رو می دهند.

این اینترفیس به چه دردی می خوره؟
فرمت بندی متد ToString
مثلا فرض کنید که یک کلاس داریم به نام "دما". به عنوان مثال مقدار این دما برابر صفر درجه ی سلسیوس هست. حالا می خواهیم این مقدار را به معادل string اون تبدیل کنیم. این کار دست کم به سه شکل امکان پذیر هست:


myTemperature.ToString()

0.00 °C (Celsius)
273.15 K (Kelvin)
32.00 °F (Fahrenheit)
حالا می خواهیم که متد:


public string ToString(string format)
قادر به این باشه که مطابق سلیقه ی کاربر دما را به یکی از این سه صورت به رشته تبدیل کند.
در اینجاست که از IFormattable استفاده می کنیم. و به ToString می گوییم که کدام فرمت را انتخاب کند. برای دیدن جزئیات این مثال به MSDN (http://msdn.microsoft.com/en-us/library/system.iformattable.aspx) مراجعه کنید.

چند مثال از موارد پرکاربرد C#‎‎‎ که این قابلیت را پیاده سازی می کنند:

Enumeration Format Strings
آیا می دانستید که در فرمت کردن enum ها کلی آزادی داریم؟
http://a.imagehost.org/0282/Enum.png

Numeric Format Strings
در برخی انواع عددی مانند Int32 و یا double می توان عدد را به رشته با فرمت standard (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx) یا custom (http://msdn.microsoft.com/en-us/library/0c899ak8.aspx) تبدیل کرد:
http://i.imagehost.org/0174/Number.png

Date and Time Format Strings
تاریخ و زمان را هم می توان با فرمت standard (http://msdn.microsoft.com/en-us/library/az4se3k1.aspx) یا custom (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx) به رشته تبدیل کرد:
http://i.imagehost.org/0795/DateTime.png

در آخر باید بگم که لازم نیست که حتما یک فرمت را برای نمایش در کنسول با ToString تبدیل کنید. بلکه می توان به شکل ساده تری اون رو به کار برد. یعنی به جای:


TimeSpan duration = new TimeSpan(1, 12, 23, 62);
string output = "Time of Travel: " + duration.ToString("c");
Console.WriteLine(output);
بنویسید:

Console.WriteLine("Time of Travel: {0:c}", duration);

cardano7
جمعه 15 مرداد 1389, 18:42 عصر
System.ICloneable
این interface کلاس را مجبور به این می کند که قابلیت clone کردن را پیاده سازی کند.


Object Clone()این قابلت می تواند به صورت دلخواه به شکل deep یا shallow پیاده سازی شود.
برای پیاده سازی shallow می توان از MemberwiseClone (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) استفاده کرد.
حوصله توضیح تفاوت بین deep یا shallow را نداشتم برای همین فقط یک شکل ایجاد کردم که این تفاوت را توضیج بده.
http://j.imagehost.org/0947/Clone.png

توجه داشته باشد که این متد خروجی از جنس object داره و عمدتا نیازمند Type Cast کردن هست.(فکر می کنید چرا؟ (http://stackoverflow.com/questions/536349/why-no-icloneablet))

همچنین ببینید:
http://msdn.microsoft.com/en-us/library/system.icloneable.aspx
http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx
http://en.csharp-online.net/ICloneable

cardano7
دوشنبه 18 مرداد 1389, 14:49 عصر
System.IAsyncResult
برای اجرا کردن یک تابع به شکل Asynchronous معمولا یک شی از نوع delegate معرفی می کنیم و یکی از متدهای آن یعنی BeginInvoke را صدا می زنیم این متد خروجی از نوع IAsyncResult به ما می دهد. همان اینترفیسی که بحث این پست هست. مثال خود MSDN رو پیگیری می کنیم:

IAsyncResult result = caller.BeginInvoke(3000,
out threadId, null, null);

حاصل بدست آمده قابلیت کنترل روی اجرای تابع Asynchronous را دارد. تا اینجا تابع Asynchronous ما اجرا شده و نمی دونیم الان در کدوم خط اجرا قرار داره. مثلا داره یک سری داده رو از بانک اطلاعاتی میگیره. این کار داره در یک Thread دیگه انجام میشه. و Thread ما داره به کار خودش ادامه میده. مثلا تو این مدت یک سری برگه رو داره Print می کنه. با این کار در وقت صرفه جویی کرده ایم و Thread اصلی برنامه را برای خواندن بانک اطلاعاتی متوقف نکردیم. حالا برگه ها چاپ شدند و می خواهیم نتیجه ی تابع رو بگیریم.
برای این کار سه مرحله رو باید طی کنیم. اول اینکه با اینترفیس بدست آمده به Thread اصلی بگوییم که منتظر شود تا Thread دوم کارش رو تمام کند:

result.AsyncWaitHandle.WaitOne();


سپس نتیجه ی حاصله را جمع آوری کنیم:

string returnValue = caller.EndInvoke(out threadId, result);

و آخر سر هم AsyncWaitHandle را ببندیم:

result.AsyncWaitHandle.Close();


این هم مثال MSDN هست:
http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx

اگر کسی در این زمینه تجربه داره و بهتر می تونه این interface رو توضیح بده، ممنون میشم که یک پست در اینجا قرار بده و من به اون لینک بدم.

cardano7
شنبه 20 شهریور 1389, 06:54 صبح
System.ICollection

این interface به این منظور استفاده می شود که شما یک مجموعه از اشیاء از یک نوع خاص را manage کنید.

شما مثلا یک کلاس از نوع Box می سازید. بعد تصمیم می گیرید که یک کلاسی بسازید که یک مجموعه داده از نوع Box را نگهداری کنه. شما باید متد ها و property هایی همچون Add، Remove، Contains و غیره را پشتیبانی کنید.

ممکنه این سوال به ذهنتون برسه که خوب چرا از از <List<Box استفاده نکنیم؟ در چواب باید گفت که خود <List<Box هم از همین interface استفاده می کنه. و در اکثر مواقع جوابگو هست مگر اینکه بخواهید خودتان به شیوه ی دیگری مجموعه را مدیریت کنید. مثلا ممکنه بخواهید یک لیست پیوندی یک طرفه را به کار ببرید.

فکر می کنم که یک مثال ساده از هر چیز گویاتر باشه:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace myTutorial_Interface_ICollection
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

#region Designer
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.buttonAdd = new System.Windows.Forms.Button();
this.listBox1 = new System.Windows.Forms.ListBox();
this.textBoxBoxName = new System.Windows.Forms.TextBox();
this.buttonRemove = new System.Windows.Forms.Button();
this.buttonClear = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// buttonAdd
//
this.buttonAdd.Location = new System.Drawing.Point(21, 26);
this.buttonAdd.Name = "buttonAdd";
this.buttonAdd.Size = new System.Drawing.Size(75, 23);
this.buttonAdd.TabIndex = 2;
this.buttonAdd.Text = "Add";
this.buttonAdd.UseVisualStyleBackColor = true;
this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(102, 54);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(149, 199);
this.listBox1.TabIndex = 1;
//
// textBoxBoxName
//
this.textBoxBoxName.Location = new System.Drawing.Point(102, 28);
this.textBoxBoxName.Name = "textBoxBoxName";
this.textBoxBoxName.Size = new System.Drawing.Size(149, 20);
this.textBoxBoxName.TabIndex = 0;
//
// buttonRemove
//
this.buttonRemove.Location = new System.Drawing.Point(21, 56);
this.buttonRemove.Name = "buttonRemove";
this.buttonRemove.Size = new System.Drawing.Size(75, 23);
this.buttonRemove.TabIndex = 3;
this.buttonRemove.Text = "Remove";
this.buttonRemove.UseVisualStyleBackColor = true;
this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
//
// buttonClear
//
this.buttonClear.Location = new System.Drawing.Point(21, 85);
this.buttonClear.Name = "buttonClear";
this.buttonClear.Size = new System.Drawing.Size(75, 23);
this.buttonClear.TabIndex = 4;
this.buttonClear.Text = "Clear";
this.buttonClear.UseVisualStyleBackColor = true;
this.buttonClear.Click += new System.EventHandler(this.buttonClear_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(272, 267);
this.Controls.Add(this.buttonClear);
this.Controls.Add(this.buttonRemove);
this.Controls.Add(this.textBoxBoxName);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.buttonAdd);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.Button buttonAdd;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.TextBox textBoxBoxName;
private System.Windows.Forms.Button buttonRemove;
private System.Windows.Forms.Button buttonClear;

#endregion

BoxCollection boxList = new BoxCollection();

private void buttonAdd_Click(object sender, EventArgs e)
{
Box myBox = new Box(textBoxBoxName.Text);
boxList.Add(myBox);
RefreshList();
textBoxBoxName.SelectAll();
textBoxBoxName.Focus();
}

private void RefreshList()
{
listBox1.Items.Clear();
foreach (Box b in boxList)
listBox1.Items.Add(b.ToString());
}

private void buttonRemove_Click(object sender, EventArgs e)
{
if (listBox1.SelectedItem != null)
{
Box found = boxList.FindFirst(listBox1.SelectedItem.ToString() );
if(found!=null)
if (boxList.Remove(found))
RefreshList();
}
}

private void buttonClear_Click(object sender, EventArgs e)
{
boxList.Clear();
RefreshList();
}
}

public class Box
{
private string _name;
private Box _NextBox=null;

public string name
{
get
{
return _name;
}
}

public Box(string name)
{
_name = name;
}

public override string ToString()
{
return name;
}

public Box NextBox
{
get { return _NextBox; }
set { _NextBox = value; }
}
}

public class BoxCollection : ICollection<Box>
{
Box firstBox;

public Box FirstBox
{
get { return firstBox; }
}

Box LastBox
{
get
{
Box indexBox = FirstBox;
if (indexBox == null)
return null;
while (indexBox.NextBox != null)
indexBox = indexBox.NextBox;
return indexBox;
}
}

Box Before(Box item)
{
Box indexBox = FirstBox;
if (indexBox == null)
return null;
while (indexBox.NextBox != null)
{
if (indexBox.NextBox == item)
return indexBox;
indexBox = indexBox.NextBox;
}
return null;
}

public Box FindFirst(string text)
{
foreach (Box b in this)
if (b.name == text)
return b;
return null;
}

public void Add(Box item)
{
if (firstBox == null)
firstBox = item;
else
LastBox.NextBox = item;
}

public void Clear()
{
firstBox = null;
}

public bool Contains(Box item)
{
Box indexBox = FirstBox;
if (indexBox == null)
return false;
while (indexBox.NextBox != null)
{
if (indexBox == item)
return true;
indexBox = indexBox.NextBox;
}
return false;
}

public void CopyTo(Box[] array, int arrayIndex)
{
throw new NotImplementedException();
}

public int Count
{
get
{
Box indexBox = FirstBox;
int count = 0;
if (indexBox == null)
return count;
while (indexBox.NextBox != null)
{
count++;
indexBox = indexBox.NextBox;
}
return count;
}
}

public bool IsReadOnly
{
get { return false; }
}

public bool Remove(Box item)
{
Box before = Before(item);
Box next = item.NextBox;
if (!this.Contains(item))
return false;
if (firstBox == item)
firstBox = firstBox.NextBox;
else if (next == null)
before.NextBox = null;
else
before.NextBox = next;
return true;
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return new BoxEnumerator(firstBox);
}

IEnumerator<Box> IEnumerable<Box>.GetEnumerator()
{
return new BoxEnumerator(firstBox);
}
}

public class BoxEnumerator:IEnumerator<Box>
{
Box currentItem;

public BoxEnumerator(Box first)
{
currentItem =new Box("");
currentItem.NextBox= first;
}

Box IEnumerator<Box>.Current
{
get { return currentItem; }
}

void IDisposable.Dispose()
{
currentItem = null;
}

object IEnumerator.Current
{
get { return currentItem; }
}

bool IEnumerator.MoveNext()
{
if (currentItem == null)
return false;
else
{
currentItem = currentItem.NextBox;
return (currentItem!=null);
}
}

void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
}
اگه سوالی هم داشتید در خدمتم.

cardano7
یک شنبه 25 مهر 1389, 16:21 عصر
System.Collections.IDictionary

از اون جایی که دیدم زیاد از این تاپیک استقبال نمیشه من هم زیاد وقت صرفش نمی کنم. و یک سری توضیح سریع میدم فقط جهت معرفی. در صورتی که مایل بودید می تونید به لینک MSDN مراجعه کنید. خیلی هم کاملتر هست. و این تاپیک برای کسانی هست که حال انگلیسی خوندن رو ندارند.
لینک MSDN (http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx)

این اینترفیس همون طور که از نامش پیداست، باید به صورت یک دیکشنری پیاده سازی بشه. این دیکشنری داده هایی از جنس DictionaryEntry را به شکل آرایه در خود دارد. این داده ها از دو بخش key و value تشکیل شده اند. توجه کنید که key ها نباید تداخل نام داشته باشند.

MSDN- لیست متدها (http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx#methodTableTog gle)
متدهای پشتیبانی شونده:


Add
Clear
Contains
CopyTo
GetEnumerator()
GetEnumerator()
Remove

توجه داشته باشید که سه نوع دیکشنری می توان داشت:


فقط خواندنی: قابل تغییر نیست.
با طول ثابت: قابلیت add یا remove را به کاربر نمی دهد. موارد موجود را می توان در آن تغییر داد.
با طول متغیر: هیچ کدام از این محدودیت ها را ندارد.


مثال MSDN (http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx#exampleToggle)

مهدی عابدینی
چهارشنبه 28 مهر 1389, 14:10 عصر
مطلابتون عالی بود ، امیدوارم موفق باشید
لطفا ادامه بدید

مهدی عابدینی
چهارشنبه 28 مهر 1389, 14:11 عصر
مطالبتون عالی بود
تشکر از زحماتتون
لطفا ادامه بدید.

cardano7
یک شنبه 09 آبان 1389, 03:50 صبح
System.Windows.Forms.IButtonControl

این اینترفیس برای این به کار می روی که دکمه یی که طراحی کردید بتواند به عنوان دکمه ی پیشفرض یا cancel با محیط خود ارتباط بر قرار کند.

اعضای این اینترفیس:


پراپرتی:


DialogResult (http://msdn.microsoft.com/en-us/library/system.windows.forms.ibuttoncontrol.dialogresult.a spx): بعد از اینکه روی این دکمه کلید کردید، چه مقداری به عنوان DialogResult بر گردانده شود.


توابع:


NotifyDefault (http://msdn.microsoft.com/en-us/library/system.windows.forms.ibuttoncontrol.notifydefault. aspx): تعیین می کند که آیا دکمه ی ما پیشفرض هست یا نه.

public void NotifyDefault(bool value) PerformClick (http://msdn.microsoft.com/en-us/library/system.windows.forms.ibuttoncontrol.performclick.a spx): زمانی که دکمه فشار داده شود، فراخوانی می شود.
لینک MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.ibuttoncontrol.aspx)

Alirezanet
شنبه 26 اسفند 1391, 23:55 عصر
دوست عزیز ابتدا از اینکه به معرفی اینترفیس ها پرداختید و .... تشکر میکنم ولی برای اینکه برای سایر دوستان هم روشن بشه باید بگم این Interface هایی که معرفی میکنید متعلق به زبان C# نیست ...
چون توی پست اولتون گفته بودید اینترفیس های C# !!!!!!

کلا اینها توابع و ابزارهایی هستند که دات نت در اختیار برنامه نویسان قرار داده و اکثرا توی سایر زبان های تحت .net هم قابل استفاده هستند ... حالا چه Vb , چه C# !, ...
موفق باشید

sddban
دوشنبه 11 شهریور 1392, 10:51 صبح
این تاپیک رو ادامه نمیدید ؟‌
من مشکلی با اینتر فیس IComparer داشتم
امیدوار بودم با توضیحات شما حل شه