۸-۶-۱۳۸۷, ۰۸:۴۶ صبح
delegates:
سلام . می خوام درباره delegate توی سی شارپ واستون صحبت کنم . اگه با سی پلاس پلاسی کار کرده باشید احتمالا با اشاره گر به توابع آشنایی دارید یا همون Function pointer كه توي سي شارپ delegate مفهوم مشابهي رو پیاده سازی می کنه . ما خیلی راحت توی برنامه هایی که تا حالا می نوشتیم یک سری متغییر ، آرایه و.. رو به عنوان آرگومان به توابع ارسال می کردیم ولی بعضی مواقع لازمه که یک تابع به عنوان آرگومان به یک تابع دیگه ارسال بشه . ممکنه بپرسید چرا همچین کاری میاز بشه . مثلا فرض کنید قصد دارین تابع مرتب سازی حبابی رو به صورت صعودی و نزولی بنویسید ، خوب می تونید دو تابع جدا یکی برای مرتب سازی صعودی و یک تابع برای مرتب سازی نزولی جدا از هم بنویسید ، ولی با استفاده از delegate می توانیم این کار را با یک تابع منفرد انجام دهیم و برای این کار باید عمل مقایسه رو برای صعودی و نزولی بودن به عنوان آرگومان به این delegateپاس دهیم . البته delegate كارايي هاي دیگه های هم بر همین مبنا داره که به مرور زمان باهاشون آشنا میشید .برای تعریف یک delegate و استفاده از آن بیاد مراحل زیر را طی کنیم .در ابتدا باید الگوی delegateرا تعریف کنیم که شامل کلمه کلیدی delegateو امضای توابعی می باشد که این delegate می تواند یک ارجاع به آنها داشته باشد ، یعنی توابعی که به این delegate به عنوان آرگومان ارسال می شوند باید لیست پارامترها و نوع برگشتی کاملا یکسانی با این delegate داشته باشند . بعد از این که delegate را اعلان کردیم ، باید در مکان مناسب آن را فراخوانی کنیم و تابع مناسب ر به آن پاس دهیم .
مثال زیر رو کامل بررسی کنید ، فکر نکنم نکته مبهمی توش وجود داشته باشه . اگه مشکلی بود بپرسید .
سلام . می خوام درباره delegate توی سی شارپ واستون صحبت کنم . اگه با سی پلاس پلاسی کار کرده باشید احتمالا با اشاره گر به توابع آشنایی دارید یا همون Function pointer كه توي سي شارپ delegate مفهوم مشابهي رو پیاده سازی می کنه . ما خیلی راحت توی برنامه هایی که تا حالا می نوشتیم یک سری متغییر ، آرایه و.. رو به عنوان آرگومان به توابع ارسال می کردیم ولی بعضی مواقع لازمه که یک تابع به عنوان آرگومان به یک تابع دیگه ارسال بشه . ممکنه بپرسید چرا همچین کاری میاز بشه . مثلا فرض کنید قصد دارین تابع مرتب سازی حبابی رو به صورت صعودی و نزولی بنویسید ، خوب می تونید دو تابع جدا یکی برای مرتب سازی صعودی و یک تابع برای مرتب سازی نزولی جدا از هم بنویسید ، ولی با استفاده از delegate می توانیم این کار را با یک تابع منفرد انجام دهیم و برای این کار باید عمل مقایسه رو برای صعودی و نزولی بودن به عنوان آرگومان به این delegateپاس دهیم . البته delegate كارايي هاي دیگه های هم بر همین مبنا داره که به مرور زمان باهاشون آشنا میشید .برای تعریف یک delegate و استفاده از آن بیاد مراحل زیر را طی کنیم .در ابتدا باید الگوی delegateرا تعریف کنیم که شامل کلمه کلیدی delegateو امضای توابعی می باشد که این delegate می تواند یک ارجاع به آنها داشته باشد ، یعنی توابعی که به این delegate به عنوان آرگومان ارسال می شوند باید لیست پارامترها و نوع برگشتی کاملا یکسانی با این delegate داشته باشند . بعد از این که delegate را اعلان کردیم ، باید در مکان مناسب آن را فراخوانی کنیم و تابع مناسب ر به آن پاس دهیم .
مثال زیر رو کامل بررسی کنید ، فکر نکنم نکته مبهمی توش وجود داشته باشه . اگه مشکلی بود بپرسید .
کد:
publicclass DelegateBubbleSort
{
publicdelegatebool Comparator( int element1,
int element2 );
// sort array using Comparator delegate
publicstaticvoid SortArray( int[] array,
Comparator Compare )
{
for ( int pass = 0; pass < array.Length; pass++ )
for ( int i = 0; i < array.Length - 1; i++ )
if ( Compare( array[ i ], array [ i + 1 ] ) )
Swap( ref array[ i ], ref array[ i + 1 ] );
}
// swap two elements
privatestaticvoid Swap( refint firstElement,
refint secondElement )
{
int hold = firstElement;
firstElement = secondElement;
secondElement = hold;
}
}
----------------------
// Fig. 10.25: BubbleSortForm.cs
// Demonstrates bubble sort using delegates to determine
// the sort order.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
publicclass BubbleSortForm : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox originalTextBox;
private System.Windows.Forms.TextBox sortedTextBox;
private System.Windows.Forms.Button createButton;
private System.Windows.Forms.Button ascendingButton;
private System.Windows.Forms.Button descendingButton;
private System.Windows.Forms.Label originalLabel;
private System.Windows.Forms.Label sortedLabel;
privateint[] elementArray = newint[ 10 ];
// create randomly generated set of numbers to sort
privatevoid createButton_Click( object sender,
System.EventArgs e )
{
// clear TextBoxes
originalTextBox.Clear();
sortedTextBox.Clear();
// create random-number generator
Random randomNumber = new Random();
// populate elementArray with random integers
for ( int i = 0; i < elementArray.Length; i++ )
{
elementArray[ i ] = randomNumber.Next( 100 );
originalTextBox.Text += elementArray[ i ] + "\r
}
}
// delegate implementation for ascending sort
privatebool SortAscending( int element1, int element
{
return element1 > element2;
}
// sort randomly generated numbers in ascending order
privatevoid ascendingButton_Click( object sender,
System.EventArgs e )
{
// sort array, passing delegate for SortAscending
DelegateBubbleSort.SortArray( elementArray,
new DelegateBubbleSort.Comparator(
SortAscending ) );
SortAscending ) );
DisplayResults();
}
// delegate implementation for descending sort
privatebool SortDescending( int element1, int element2
{
return element1 < element2;
}
// sort randomly generating numbers in descending order
privatevoid descendingButton_Click( object sender,
System.EventArgs e )
{
// sort array, passing delegate for SortDescending
DelegateBubbleSort.SortArray( elementArray,
new DelegateBubbleSort.Comparator(
SortDescending ) );
DisplayResults();
}
// display the sorted array in sortedTextBox
privatevoid DisplayResults()
{
sortedTextBox.Clear();
foreach ( int element in elementArray )
sortedTextBox.Text += element + "\r\n";
}
// main entry point for application
publicstaticvoid Main( string[] args )
Application.Run( new BubbleSortForm() );
}
}