-
ارسال تعداد متغیر پارامتر به یک متود
با استفاده از کلمه کلیدی params مانند نمونه زیر : public int Add(params int[] list)
{
int sum = 0;
foreach (int i in list)
sum += i;
return sum;
}
حال میتونیم این متود را به این شکل صدا بزنیم :
int ans1 = Add(1);
int ans2 = Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int ans3 = Add(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
int ans4 = Add();
نکته : متود میتواند چندین پارامتر دیگر غیر از پارامتر از نوع params بپذیرد اما پارامتر params حتما باید آخرین پارامتر باشد. مانند :
public void AddAndPrint(string str, params int[] list)
{
int sum = 0;
foreach (int i in list)
sum += i;
Console.WriteLine(str + sum);
}
منبع : http://blog.paranoidferret.com/index...arams-keyword/
-
Serialize کردن باینری آبجکت در فایل
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public void SerializeObject(string filename, Object o)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, o);
stream.Close();
}
منبع : http://blog.paranoidferret.com/index...cts-to-a-file/
-
ایندکسرها (Indexers)
ایندکسرها نوعی از پراپرتیها هستند که به شما اجازه میدهند با اشیاء کلاس خود آرایه وار رفتار کنید.
تعریف یک ایندکسر نیز مانند تعریف یک پراپرتی است و در حالت کلی داریم :
<Modifier> <Return type> this[arguments]
{
get { }
Set { }
}
برای مثال - با فرض داشتن کلاسی مانند :
class Employee
{
private string[] name = new string[10];
public string this[int index]
{
get
{
return name[index];
}
set
{
name[index] = value;
}
}
}
میتوان نوشت :
Employee emp = new Employee();
emp[0] = "Joydip";
emp[1] = "Manashi";
emp[2] = "Jini";
نکته :
+ ایندکسرها حتما باید یک پارامتر داشته باشد.
+ ایندکسرها نمیتوانند استاتیک باشند (بعلت نیاز به this)
____________________________________________
منبع : http://aspalliance.com/800_Properties_and_Indexers_in_C
-
Auto Intellisense در web.config
حتما همه دیدیدن که در Visual Studio 2008 فایل های Configuration رو به صورت Intellisense دار می تونین استفاده کنین. به این معنی که وقتی شما ابتدای کلمه ای رو تایپ می کنین دقیقا مثل کد های سی شارپ خودش ادامش رو براتون نمایش میده :
http://www.scottgu.com/BlogPosts/web.../webconfig.png
نکته ای که وجود داره این است که گاهی اوقات این Intellisense دیگه کار نمی کنه. برای اینکه این مشکل حل بشه خوبه بدونین که دلیل اینه که توی فایل web.config تون در قسمت یه تکه کد اضافه شده که اونو به صورت زیر تغییر داده :
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
تنها کاری که باید انجام بدین اینه که برین و namespace مربوطه رو حذف کنین و همان configuration رو داشته باشین:
<configuration>
اینجوری مشکلتون حل میشه!
-
Serialize کردن object در XML
برای Serialize کردن یک object در فایل XML می تونین از این کد استفاده کنین:
XmlSerializer xmSer = new XmlSerializer(typeof(Person));
FileStream st = new FileStream("C:\\Test.xml",FileMode.OpenOrCreate);
Person p = new Person("Ali Rezaei",44);
xmSer.Serialize(st, p);
st.Close();
-
DeSerialize کردن object از XML
برای بازیابی شیء تون از یک فایل XML می تونین از این کد استفاده کنین:
XmlSerializer xmSer = new XmlSerializer(typeof(Person));
FileStream st = new FileStream("C:\\Test.xml",FileMode.Open);
Person p = xmSer.Deserialize(st) as Person;
st.Close();
-
Serialize کردن object در SOAP XML
برای Serialize کردن object تون توی فایل Soap می تونین از این کد استفاده کنین.
دقت کنین که باید System.Runtime.Serialization.Formatters.Soap رو Add Reference و using کنین.
SoapFormatter soap = new SoapFormatter();
FileStream st = new FileStream("C:\\Test.soap",FileMode.OpenOrCreate);
Person p = new Person("Ali Rezaei", 33);
soap.Serialize(st, p);
st.Close();
-
DeSerialize کردن object از SOAP XML
برای بازیابی شیء تون از یک فایل SOAP می تونین از این کد استفاده کنین:
SoapFormatter soap = new SoapFormatter();
FileStream st = new FileStream("C:\\Test.soap",FileMode.Open);
Person p = soap.Deserialize(st) as Person;
st.Close();
-
تعریف عملگر های سفارشی
class MyClass
{
private int number ;
public MyClass(int _number)
{
this.number = _number;
}
public static MyClass operator+ (MyClass c1, MyClass c2)
{
return new MyClass(c1.number + c2.number);
}
}
تعریف یک Operator overloading همیشه باید بصورت Static و Public باشد و مقدار برگشتی آن نیز نمیتواند void باشد.
.
-
چگونه یک کلاس را مهر وموم کنیم؟
کافی است در اعلان کلاس و بعد از Access modifier از کلمه کلیدی sealed استفاده کنیم.
public sealed class MyClass{}
-
بدست آوردن شماره سریال پراسسور (CPU Id)
ابتدا System.Management رو به References پروژه بیفزایید و سپس :
using System.Management;
public string GetCPUId()
{
string cpuInfo = String.Empty;
//create an instance of the Managemnet class with the
//Win32_Processor class
ManagementClass mgmt = new ManagementClass("Win32_Processor");
//create a ManagementObjectCollection to loop through
ManagementObjectCollection objCol = mgmt.GetInstances();
//start our loop for all processors found
foreach (ManagementObject obj in objCol)
{
if (cpuInfo == String.Empty)
{
// only return cpuInfo from first CPU
cpuInfo = obj.Properties["ProcessorId"].Value.ToString();
}
}
return cpuInfo;
}
منبع : http://www.dreamincode.net/forums/in...0&#entry307855
-
DeSerialize کردن باینری آبجکت از فایل
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public object DeSerializeObject(string filename)
{
object o;
Stream stream = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
o =
(ObjectToSerialize)bFormatter.Deserialize(stream);
stream.Close();
return o;
}
منبع : http://blog.paranoidferret.com/index...cts-to-a-file/
-
بدست آوردن نام شرکت سازنده پراسسور (CPU Manufacturer)
ابتدا System.Management رو به References پروژه بیفزایید و سپس :
using System.Management;
public string GetCPUManufacturer()
{
string cpuMan = String.Empty;
//create an instance of the Managemnet class with the
//Win32_Processor class
ManagementClass mgmt = new ManagementClass("Win32_Processor");
//create a ManagementObjectCollection to loop through
ManagementObjectCollection objCol = mgmt.GetInstances();
//start our loop for all processors found
foreach (ManagementObject obj in objCol)
{
if (cpuMan == String.Empty)
{
// only return manufacturer from first CPU
cpuMan = obj.Properties["Manufacturer"].Value.ToString();
}
}
return cpuMan;
}
منبع : http://www.dreamincode.net/forums/in...0&#entry307855
-
بدست آوردن میزان فضای خالی یک درایو (پارتیشن)
ابتدا System.Management رو به References پروژه بیفزایید و سپس :
using System.Management;
public double GetHDDFreeSpace(string drive)
{
//check to see if the user provided a drive letter
//if not default it to "C"
if (drive == "" || drive == null)
{
drive = "C";
}
//create our ManagementObject, passing it the drive letter to the
//DevideID using WQL
ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");
//bind our management object
disk.Get();
//return the free space amount
return Convert.ToDouble(disk["FreeSpace"]);
}
منبع : http://www.dreamincode.net/forums/in...0&#entry307855
-
بدست آوردن حجم کلی یک درایو (پارتیشن)
ابتدا System.Management رو به References پروژه بیفزایید و سپس :
using System.Management;
public double getHDDSize(string drive)
{
//check to see if the user provided a drive letter
//if not default it to "C"
if (drive == "" || drive == null)
{
drive = "C";
}
//create our ManagementObject, passing it the drive letter to the
//DevideID using WQL
ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");
//bind our management object
disk.Get();
//return the HDD's initial size
return Convert.ToDouble(disk["Size"]);
}
منبع : http://www.dreamincode.net/forums/in...0&#entry307855
-
چرا و کی باید از کلاس StringBuilder به جای string استفاده کنیم ؟
آبجکتهای string در دات نت immutable (غیرقابل تغییر) هستند :به این معنا که پس از مقدار گرفتن، دیگر قابل تغییر نیستند.
به مثال زیر دقت کنید :
string temp = "a";
temp = temp + "b";
temp += "c";
temp += "d";
در این مثال ابتدا یک آبجکت از نوع string میسازید، اما در خطوط بعدی با هر بار تغییر مقدار آن؛ آبجکتهای قدیمی فراموش و یک آبجکت جدید از نوع string - با مقدار جدید - ساخته میشود.
به این ترتیب میشه انتظار داشت که کد زیر چه سربار وحشتناکی روی منابع سیستم میتونه داشته باشه :
string s2 = new String('x', Int32.Parse(args[0]));
int loops = Int32.Parse(args[1]);
for (int j = 0; j < 10000000; j++) {
string s = "";
for (int i = loops; i > 0; --i)
s += s2;
}
بصورت کلی در حالتیکه اعمال تغییرات زیاد روی رشته ها نیاز باشد بهتر است آبجکتی از کلاس StringBuilder ساخته و با خاصیت Append آن کار کنیم.
مثال - پیاده سازی همان کد قبلی :
string s2 = new String('x', Int32.Parse(args[0]));
int loops = Int32.Parse(args[1]);
for (int j = 0; j < 10000000; j++) {
StringBuilder sb = new StringBuilder();
for (int i = loops; i > 0; --i)
sb.Append(s2);
sb.ToString();
}
منبع : http://www.heikniemi.net/hc/archives/000124.html
-
ساختن یک لیست ژنریک از اشیاء
با فرض داشتن کلاسی مانند :
public class Person
{
public Person() { }
public Person(string _firstName, string _lastName)
{
this.firstName = _firstName;
this.lastName = _lastName;
}
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
میتونیم بنویسیم :
List<Person> persons = new List<Person>();
persons.Add(new Person("ali", "ahmadi");
persons.Add(new Person("maryam", "hosseini");
-
ساختن لیستی از کنترلها در زمان اجرا
مثال:ساختن 10 دکمه درون یک لیست ژنریک و اختصاص آن به لیست کنترلهای یک فرم
private void Form1_Load(object sender, EventArgs e)
{
List<Button> buttons = new List<Button>();
for (int i = 0; i < 10; i++)
{
Button btn = new Button();
btn.Size = new Size(120, 22);
btn.Text = string.Format("Button{0}", i);
btn.Location = new Point(10, i * 25 + 10);
buttons.Add(btn);
}
this.Controls.AddRange(buttons.ToArray());
}
-
اختصاص دادن رویداد به کنترلهای ساخته شده در runtime
private void Form1_Load(object sender, EventArgs e)
{
List<Button> buttons = new List<Button>();
for (int i = 0; i < 10; i++)
{
Button btn = new Button();
btn.Size = new Size(120, 22);
btn.Text = string.Format("Button{0}", i);
btn.Location = new Point(10, i * 25 + 10);
btn.Click += new EventHandler(btn_Click);
buttons.Add(btn);
}
this.Controls.AddRange(buttons.ToArray());
}
void btn_Click(object sender, EventArgs e)
{
for (int i = 0 ; i < 10 ; i++)
{
Button btn = sender as Button;
btn.Location = new Point(btn.Left + i, btn.Top);
Application.DoEvents();
}
}
-
sort کردن آبجکتهای یک کلاس با پیاده سازی اینترفیس IComparable
کلاس مورد نظر باید اینترفیس IComparable رو پیاده سازی کند. (این اینترفیس تنها یک متود CompareTo دارد)
به نحوه ی پیاده سازی متود CompareTo دقت کنید :
public class Person : IComparable
{
private string _firstname;
public string Firstname
{
get { return _firstname; }
set { _firstname = value; }
}
private string _lastname;
public string Lastname
{
get { return _lastname; }
set { _lastname = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public Person(string firstname, string lastname, int age)
{
_firstname = firstname;
_lastname = lastname;
_age = age;
}
public int CompareTo(object obj)
{
if (obj is Person)
{
Person p2 = (Person)obj;
return _firstname.CompareTo(p2.Firstname);
}
else
throw new ArgumentException("Object is not a Person.");
}
public override string ToString()
{
return String.Format("{0} {1}, Age = {2}", _firstname,
_lastname, _age.ToString());
}
}
مثال - Sort کردن افراد از روی اسم کوچک (استفاده از کلاس بالا) :
List<Person> persons = new List<Person>();
persons.Add(new Person("Behrouz", "Rad", 30));
persons.Add(new Person("Omid", "Mottaghi Rad", 31));
persons.Add(new Person("Mehdi", "Keramati", 32));
persons.Add(new Person("Ali", "Keshavarz", 33));
persons.Add(new Person("Mohammad", "Heshemian", 34));
persons.Add(new Person("Farhad", "XXX", 35));
//Before Sorting
listBox1.Items.AddRange(persons.ToArray());
//ُSorting List
persons.Sort();
//Sorted List
listBox2.Items.AddRange(persons.ToArray());
منبع : http://codebetter.com/blogs/david.ha...ges/56094.aspx
-
فراخوانی یک متد با یک Threadجداگانه
معمولا متدهایی که بار پردازشی زیادی دارند موجب کندی برنامه میشن
برای جلوگیری از این کار میشه این متد هارو با استفاده از یک Thread متفاوت از Thread اصلی برنامه فراخوانی کرد.
using System.Threading;
فرض کنیم این متد رو داریم :
void DoSomething()
{
...
}
تعریف Thread جدید برای متد مورد نظر :
Thread myThread = new Thread(new ThreadStart(this.DoSomthing));
فراخوانی متد با استفاده از متد تعریف شده:
myThread.Start();
برای متوقف کردن Threadایجاد شده :
myThread.Abort();
نکته :
هر Threadفقط میتواند با object هایی کار کند که خودش آنها را ایجاد کرده است. مثلا اگر در متد DoSomethingشما بخواهید با یک label که روی فرم است کار کنید cross-thread exception رخ خواهد داد چون آن label بوسیله Threadاصلی برنامه ایجاد شده است.
-
نوشتن یک Event برای تعدادی کنترل و انجام کار مشابه بر روی انها
ممکنه توی فرمتون تعداد زیادی TextBox باشه و بخوایید هر بار که اون فوکوس میشه متن داخلش انتخاب بشه تا اگه کاربر بخواد اون رو عوض کنه نیازی به Del و BackSpace نداشته باشه (و یا اعمال دیگر )
میشه برای هر TextBox یه Event نوشت و اون کار رو انجام بدید
حالا اگه تعداد textBox ها زیاد باشه برای هر کنترل یک Event:اشتباه:
میشه برای همه اونهایک Event نوشت تا اینکار رو برای همه اونها انجام بده :
اول باید همه TextBox هایی رو که می خوایید انتخاب کنین بعد یه Event براشون بزارین تا همشون از یه Event استفاده کنند بعد این کد رو داخل اون Event می گذارید
private void textBox1_Enter(object sender, EventArgs e)
{
TextBox txtbx = sender as TextBox;
txtbx.text.selectall();
}
-
اصلاح تورفتگی های پیشفرض محیط ادیتور
ممکنه در زمانی که کد می نویسید تورفتگی های پیشفرضی که محیط ادیتور ایجاد می کنه بهم بریزه و کم یا زیاد بشه
حالا اگه بخواییم با Space و Del درستشون کنیم که:عصبانی++:
میشه اینکارو به ادیتور سپرد
1- اول کد را انتخاب می کنیم و یا کل کد Ctrl+A
2- بعد Ctrl+K
3- در آخر Ctrl+F
میشه با این کلید ها هم انجام داد Ctrl+E,D
با این روش کل کد مرتب میشه
از Edit هم قابل دسترسی است :
Edit > Advanced > Format Document
-
به دست آوردن نام یک Enum از عدد متناظر آن
public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };
string s= Enum.GetName(typeof(Days),4);
-
فقط یک نمونه از برنامه بتواند اجرا شود (با استفاده از Mutex)
using System.Threading;
متود Main از کلاس StartUp پروژه رو به این شکل تغییر بدید :
[STAThread]
static void Main()
{
bool ok;
Mutex m = new Mutex(true, "YourNameHere", out ok);
if (! ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1()); // or whatever was there
GC.KeepAlive(m); // important!
}
منبع : http://www.ai.uga.edu/mc/SingleInstance.html
-
کار با اشیاء بوسیله ی نام آنها (با کمک از Reflection)
مثال - نمایش یک فرم با دانستن نام آن :
(این مثال کاربردهای زیادی میتواند داشته باشد، فرض کنید که نام فرمهای مورد نیاز برای کاربردی خاص رو در یک جدول دیتابیس ذخیره کرده اید)
using System.Reflection;
private void button1_Click(object sender, EventArgs e)
{
Assembly myAssembly = Assembly.GetExecutingAssembly();
Form myForm =
myAssembly.CreateInstance("WindowsFormsApplication 1.Form2") as Form;
myForm.ShowDialog();
}
نکته : حتما نام NameSpace را قبل از نام آبجکت قرار دهید؛ در مثال بالا "WindowsFormsApplication1" بود.
-
کار کردن با کلاس EventLog
از این کلاس معمولا جهت Log کردن عملیات یک برنامه استفاده میشود.
(برای مشاهده آن به Event Viewer ویندوز مراجعه نمایید)
using System.Diagnostics;
// Create the source, if it does not already exist.
if(!EventLog.SourceExists("MySource"))
{
//An event log source should not be created and immediately used.
//There is a latency time to enable the source, it should be created
//prior to executing the application that uses the source.
//Execute this sample a second time to use the new source.
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatedEventSource");
Console.WriteLine("Exiting, execute the application a second time to use the source.");
// The source is created. Exit the application to allow it to be registered.
return;
}
// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";
// Write an informational entry to the event log.
myLog.WriteEntry("Writing to event log.");
منبع : http://msdn2.microsoft.com/en-us/lib....eventlog.aspx
-
1 ضمیمه
بدست آوردن جزییات اطلاعات در مورد یک پروسه در حال اجرا
using System.Diagnostics;
Process myProcess = new Process();
// Get the process start information of notepad.
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("notepad.exe");
// Assign 'StartInfo' of notepad to 'StartInfo' of 'myProcess' object.
myProcess.StartInfo = myProcessStartInfo;
// Create a notepad.
myProcess.Start();
System.Threading.Thread.Sleep(1000);
ProcessModule myProcessModule;
// Get all the modules associated with 'myProcess'.
ProcessModuleCollection myProcessModuleCollection = myProcess.Modules;
Console.WriteLine("Properties of the modules associated "
+"with 'notepad' are:");
// Display the properties of each of the modules.
for( int i=0;i<myProcessModuleCollection.Count;i++)
{
myProcessModule = myProcessModuleCollection[i];
Console.WriteLine("The moduleName is "
+myProcessModule.ModuleName);
Console.WriteLine("The " +myProcessModule.ModuleName + "'s base address is: "
+myProcessModule.BaseAddress);
Console.WriteLine("The " +myProcessModule.ModuleName + "'s Entry point address is: "
+myProcessModule.EntryPointAddress);
Console.WriteLine("The " +myProcessModule.ModuleName + "'s File name is: "
+myProcessModule.FileName);
}
// Get the main module associated with 'myProcess'.
myProcessModule = myProcess.MainModule;
// Display the properties of the main module.
Console.WriteLine("The process's main moduleName is: "
+myProcessModule.ModuleName);
Console.WriteLine("The process's main module's base address is: "
+myProcessModule.BaseAddress);
Console.WriteLine("The process's main module's Entry point address is: "
+myProcessModule.EntryPointAddress);
Console.WriteLine("The process's main module's File name is: "
+myProcessModule.FileName);
myProcess.CloseMainWindow();
پروژه مثال ضمیمه شده است.
منبع : http://msdn2.microsoft.com/en-us/lib...essmodule.aspx
-
2 ضمیمه
افزودن یک زیرمنو و دستور دلخواه به context menu ویندوز اکسپلورر
private void btnAddMenu_Click(object sender, System.EventArgs e)
{
RegistryKey regmenu = null;
RegistryKey regcmd = null;
try
{
regmenu = Registry.ClassesRoot.CreateSubKey(MenuName);
if(regmenu != null)
regmenu.SetValue("",this.txtName.Text);
regcmd = Registry.ClassesRoot.CreateSubKey(Command);
if(regcmd != null)
regcmd.SetValue("",this.txtPath.Text);
}
catch(Exception ex)
{
MessageBox.Show(this,ex.ToString());
}
finally
{
if(regmenu != null)
regmenu.Close();
if(regcmd != null)
regcmd.Close();
}
}
منبع : http://www.codeproject.com/KB/cs/app...spx?obid=10104
سورس کامل ضمیمه شد.
-
آغاز کار با کلاس Clipboard و دادن و گرفتن یک رشته متنی به/از آن
//clear clipboard
Clipboard.Clear();
//Set Text to clipboard
if (!string.IsNullOrEmpty(textBox1.Text))
Clipboard.SetText(textBox1.Text);
//Get text from clipboard
MessageBox.Show(Clipboard.GetText());
-
Hash کردن یک رشته متنی با الگوریتم MD5
using System.Security.Cryptography;
private string encryptString(string strToEncrypt)
{
UTF8Encoding ue = new UTF8Encoding();
byte[] bytes = ue.GetBytes(strToEncrypt);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(bytes);
// Bytes to string
return System.Text.RegularExpressions.Regex.Replace
(BitConverter.ToString(hashBytes), "-", "").ToLower();
}
یک مثال ساده از نحوه ی استفاده :
MessageBox.Show(encryptString("Sinpin"));
خروجی :
e140088b10c4f19588ed3624e2b3c463
-
انجام عملیات ساده بر روی کنترل Treeview
افزودن node ریشه و سپس nodeهای فرزند
treeView1.Nodes.Clear();
treeView1.Nodes.Add("World");
TreeNode[] parents={newTreeNode("Asia"),newTreeNode("Europ"), newTreeNode("Africa"),newTreeNode("Australia"),new TreeNode("Amercia")};
treeView1.Nodes[0].Nodes.AddRange(parents);
حذف node مورد نظر
treeView1.SelectedNode.Remove();
نمایش contextmenu بر روی node انتخاب شده
در رویداد Treeview, NodeMouseClick این کد را مینویسیم
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = e.Node;
e.Node.ContextMenuStrip = cmsCommand;
}
}
-
ارسال متغیر به صفحه بعد با استفاده از url
نحوه ارسال به صفحه بعد
Response.Redirect("form2.aspx?کلمه دلخواه=" + Convert.ToString("متغیر"));
نحوه استفاده از ان در صفحه دوم
string str = Request.QueryString.Get("متغیر");
-
کار با کنترل های تولید شده توسط یک Threadاز طریق Thread ی دیگر
فرض کنیم یک تابع داریم که کاری بر روی یک Label انجام میدهد.
میخواهیم این تابع را با استفاده از یک Threadدیگر فراخوانی کنیم. دقت کنید که Label توسط threadاصلی برنامه ایجاد شده و نمیتوان بصورت عادی به آن دسترسی داشت و با cross-thread exceptionمواجه میشویم.
برای این کار طبق روش زیر میتوان عمل کرد:
using System.Threading;
threadی که برای تابع مورد نظر تعریف میکنیم :
Thread t = new Thread(new ThreadStart(this.DoSomeThing));
برای تعریف تابع مورد نظر باید به نکات زیر توجه داشته باشیم:
- زمانی که کنترل مورد نظر ما (در اینجا label) دارای مقدارtrue برای خاصیت InvokeRequired باشد ما باید تابع خود را بصورت cross-thread فراخوانی کنیم. برای اینکار از متد Invoke استفاده میکنیم که یک Delegate به عنوان پارامتر میگیرد و آنرا بصورت cross-thread فراخوانی میکند.
- زمانیکه کنترل مورد نظر دارای مقدار false برای خاصیت InvokeRequiredخود باشد میتوانیم کارهای مورد نظرمان را بر روی آن انجام دهیم.
پس ما باید در ابتدا delegateی به متد مورد نظرمان تعریف کنیم و با استفاده از آن و به شکل زیر متد خود را تعریف میکنیم :
void DoSomeThing()
{
if(label.InvokeRequired)
{
delegate void myDelegate();
myDelegate del = new myDelegate(this.DoSomeThing);
Invokde(del);
}
else
//something to do on label here
}
-
معرفی چند سایت جهت تبدیل کدهای #C و VB.net به یکدیگر
-
معرفی یک Object Browser آنلاین
http://labs.developerfusion.co.uk/So...er/view/SSCLI/
از طریق این برنامه میتوانید ضمن پرسه زدن در اسمبلی و اکسپلور کردن کلاسهای مورد نظر سورس کد اونها رو هم ببینید.
برای مثال قسمتی از خروجی این برنامه برای کلاس ArrayList رو مشاهده میکنید :
// Implements a variable-size List that uses an array of objects to store the
// elements. A ArrayList has a capacity, which is the allocated length
// of the internal array. As elements are added to a ArrayList, the capacity
// of the ArrayList is automatically increased as required by reallocating the
// internal array.
//
[DebuggerTypeProxy(typeof(System.Collections.ArrayL ist.ArrayListDebugView))]
[DebuggerDisplay("Count = {Count}")]
[Serializable()]
[System.Runtime.InteropServices.ComVisible(true)]
public class ArrayList : IList, ICloneable
{
private object[] _items;
private int _size;
private int _version;
[NonSerialized()]
private object _syncRoot;
private const int _defaultCapacity = 4;
private static readonly object[] emptyArray = new object[0];
// Note: this constructor is a bogus constructor that does nothing
// and is for use only with SyncArrayList.
internal ArrayList(bool trash)
{
}
// Constructs a ArrayList. The list is initially empty and has a capacity
// of zero. Upon adding the first element to the list the capacity is
// increased to _defaultCapacity, and then increased in multiples of
// two as required.
public ArrayList()
{
_items = emptyArray;
}
.
.
.
-
نحوه استفاده کاراکترهای خاص (مثلا علامت کپی رایت)
می تونین با قرار دادن کد هگزای مربوط کاراکتر مورد نظر خود پس از "X\" آن کاراکتر را در هر متغیر رشته ای نشان دهید.
به عنوان مثال کد هگز مربوط به کاراکتر کپی رایت A9 می باشد.
چس اگر شما دستوری مانند زیر در برانامه داشته باشید
MessageBox.Show("\xA9 by barnamenevis.org 2003-2008");
-
1 ضمیمه
معرفی SharpDevelop : یک IDE سورس باز برای #C و VB.net
هدف از معرفی این IDE این است که دوستان علاقمند سورس کد اون رو (بعنوان یک پروژه واقعی و Enterprise) دانلود و مورد بررسی قرار دهند، احیانا بشه از برخی قسمتهای آن ایده گرفت.
این سورس کد از یک سولوشن متشکل از 45 پروژه به زبان سی شارپ تشکیل شده است.
جهت دانلود فایل Setup و سورس کد به لینک زیر مراجعه کنید :
http://www.icsharpcode.net/OpenSourc...SharpDevelop22
-
نحوه ی ایجاد و تخصیص ToolTip در زمان اجرا
private void Form1_Load(object sender, EventArgs e)
{
ToolTip toolTip = new ToolTip();
toolTip.SetToolTip(button1, "Salam");
}
-
Abstract Class در مقابل Interface
در حالیکه ممکن است بین یک Abstract Class (کلاس مجرد) و یک اینترفیس تشابهات زیادی وجود بنظر برسد اما تفاوتهای بین آن دو بیشتر است.
تفاوتها و اینکه کجا بهتر است از کدام استفاده کنیم :
- کلاس مجرد یکی از انواع کلاس است اما اینترفیس یک کلاس نیست.
- اینترفیس یک قرارداد را مشخص میکند اما کلاس مجرد ناتمام ماندن تعریف یک کلاس را.
- یک اینترفیس به هیچ عنوان نمیتواند شامل پیاده سازی درون خود باشد اما یک کلاس مجرد میتواند شامل پیاده سازیهای پیشفرض باشد (اعضایی داشته باشد که بصورت کامل و یا پیشفرض پیاده سازی شده اند)
- یک کلاس میتواند چندین اینترفیس را پیاده سازی کند اما تنها میتواند از یک کلاس مجرد به ارث رود.
- بصورت پیشفرض اعضای یک اینترفیس تماما public هستند و نمیتوان برای آنها access modifier انتخاب کرد در حالیکه در یک کلاس مجرد ممکن است.
- یک کلاس مجرد میتواند شامل فیلد، constructor، destructor و مقادیر ثابت باشد درحالیکه یک اینترفیس نمیتواند.
- بصورت کلی کار کردن با یک کلاس مجرد سریعتر از یک اینترفیس است.
- اینترفیسها برای نشان دادن قابلیتهای جانبی یک کلاس بکار میروند (مثلا چون هم انسان و هم اتومبیل حرکت میکنند هر دو میتوانند اینترفیس IMovable رو پیاده سازی کنند) درحالیکه یک کلاس مجرد خواص و رفتارهای اصلی یک کلاس را مشخص میکند.
- مورد قبلی بصورت خلاصه میشود : یک اینترفیس اغلب برای رابطه هایی مانند can-do و یا able-to استفاده میشود در حالیکه یک کلاس مجرد برای رابطه هایی از نوع : is-a
- اگر برای مثال یک متود را به یک اینترفیس اضافه کنیم باید تمامی جاهاییکه آن اینترفیس پیاده سازی شده را دنبال و متود مورد نظر را در آنجا پیاده سازی کنیم در حالیکه اگر از یک کلاس مجرد استفاده کنیم میتوانیم در همانجا متود را با پیاده سازی پیشفرض تعریف کنیم تا به مشکل برنخوریم.
- برای ایجاد خواص و رفتارهای مشابه روی مجموعه های بزرگ و نامرتبط از موجودات بهتر است از اینترفیس کمک بگیریم. یک کلاس مجرد تنها برای دسته بندی موجودات مرتبط بکار میرود.
- ... ادامه دارد
توجه : برخی از موارد بالا ممکن است کاملا معنای یکسانی داشته باشند و تنها در ساختار جمله بندی و یا زاویه ی نگرش تفاوت داشته باشند.
منابع :
http://www.codeproject.com/KB/cs/abs...nterfaces.aspx
http://msdn2.microsoft.com/en-us/library/scsyfw1d(vs.71).aspx
http://geekswithblogs.net/mahesh/arc.../05/84120.aspx
http://www.interviewcorner.com/Answe...orCategoryId=1
http://www.clt-services.com/docs/Abs...Interfaces.pdf
http://technologyandme.wordpress.com...bstract-class/
-
پخش فایلهای صوتی و ویدیویی با کمک winmm.dll
using System.Runtime.InteropServices;
string CommandString;
OpenFileDialog file = new OpenFileDialog();
[DllImport("winmm.dll")]
private static extern long mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, int hwndCallback);
private void button1_Click(object sender, System.EventArgs e)
{
if (file.ShowDialog() == DialogResult.OK)
{
CommandString = "open " + "\"" + file.FileName + "\"" + " type MPEGVideo alias MediaFile";
mciSendString(CommandString, null, 0, 0);
CommandString = "play MediaFile";
mciSendString(CommandString, null, 0, 0);
}
}
منبع : http://www.csharphelp.com/board2/rea...=12395&t=12395
-
MonoDevelop یک IDE سورس باز در لینوکس
نقل قول:
http://www.monodevelop.com/files/thu...px-Md-main.png
MonoDevelop is a popular, open source
integrated development environment for the Linux platform, primarily targeted for the development of software that uses both the
Mono and Microsoft
.NET framework. MonoDevelop integrates features similar to that of
Eclipse and Microsoft's
Visual Studio such as
Intellisense,
source control integration, and an integrated GUI and Web designer. MonoDevelop integrates a
GTK# GUI designer called
Stetic.
[1] It currently has language support for
C#,
Java,
Boo,
Nemerle,
Visual Basic.NET,
CIL, and
C++.
دانلود :
http://www.monodevelop.com/Download
مستندات :
http://www.monodevelop.com/Documentation
تصاویری از محیط :
http://www.monodevelop.com/Screenshots
-
انجام کارهای متداول روی درایوها (Partitions)
using System.IO;
بدست آوردن لیست تمامی درایوها :
listBox1.Items.AddRange(DriveInfo.GetDrives());
بدست آوردن لیست تمامی درایوها و نوع آنها :
foreach (DriveInfo drv in DriveInfo.GetDrives())
listBox1.Items.Add(drv.Name + ":" + drv.DriveType);
بدست آوردن میزان فضای کلی و خالی درایوها:
foreach (DriveInfo drv in DriveInfo.GetDrives())
if (drv.IsReady)
{
listBox1.Items.Add(drv.Name + " - free space: " + drv.AvailableFreeSpace);
listBox1.Items.Add(drv.Name + " - total size: " + drv.TotalSize);
}
-
property چیست و چرا از آن استفاده می کنیم؟
یک property متشکل از 2 متود set,get است که برای دریافت و یا تخصیص مقادیر به متغیر ها استفاده می شوند .از معایب تعریف متغیرهای کلاس به صورت Public اینست که هر موجودی از بیرون کلاس می تواند دسترسی مستقیمی به آن داشته باشد و براحتی آن را دستکاری کند و در ضمن هیچ گونه عمل validation بر روی مقادیر متغیر ها صورت نمیگیرد ,که این با اصول صحیح oop منافات دارد .
دلایل استفاده از property به جای یک متغیر:
1-رعایت اصل encapsulation
2-امکان بازرسی و validation
public class Circle
{
private double radius;
public double Radius
{
get
{
return radius;
}
set
{
if (value>0 && value<50)
radius = value;
}
}
public double GetArea()
{
return radius * radius * 3.14;
}
}
برای مطالعه بیشتر http://csharptuning.blogfa.com/
-
گرفتن یک فایل از طریق دیالوگ OpenFileDialog و دستکاری نام فایل
using System.IO;
OpenFileDialog openFile = new OpenFileDialog();
if (openFile.ShowDialog() != DialogResult.OK)
return;
// get filename from OpenFileDialog
string fileName = openFile.FileName;
// get only filename without extension and path
string onlyname = Path.GetFileNameWithoutExtension(fileName);
// get extension of filename
string extension = Path.GetExtension(fileName);
// get directory of specific filename
string directory = Path.GetDirectoryName(fileName);
// change the extension of specific filename
string newFileName = Path.ChangeExtension(fileName, "bmp");
// get the root partition of specific file
string root = Path.GetPathRoot(fileName);
-
طریقه ی استفاده از کامپوننت NotifyIcon
private void Form1_Load(object sender, EventArgs e)
{
NotifyIcon notify = new NotifyIcon();
notify.Icon = this.Icon;
notify.Visible = true;
// duration of show baloon as milisecond
int n = 3000;
// show baloon
notify.ShowBalloonTip(n, "Hi", "Salam Donya!", ToolTipIcon.Info);
//set an event handler
notify.MouseClick += new MouseEventHandler(notify_MouseClick);
}
void notify_MouseClick(object sender, MouseEventArgs e)
{
MessageBox.Show("man click shodam!");
}
-
بدست آوردن نام کامپیوتر، نام کاربر جاری و ... (بوسیله کلاس Environment)
string pcName = Environment.MachineName;
string currentUser = Environment.UserName;
string system32 = Environment.SystemDirectory;
string osVersion = Environment.OSVersion;
string domain = Environment.UserDomainName;
int cpuCount = Environment.ProcessorCount;
-
چند تا برنامه رایگان و مفید
چند تا برنامه رایگان و مفید برای دات نت کاران
ممکنه خیلی از دوستان این برنامه ها را داشته باشن
ممکن هم هست خیلی از دوستان نداشته باشن
--------------------------------------------------------
نقل قول:
Reflector for .NET
Reflector is the class browser, explorer, analyzer and documentation viewer for .NET. Reflector allows to easily view, navigate, search, decompile and analyze .NET assemblies in C#, Visual Basic and IL.
--------------------------------------------------------------
Resourcer for .NET
Resourcer is an editor for .resources binaries and .resX XML file formats used with the .NET platform. Resourcer allows editing of name/string pairs, import of bitmaps/icons and and merging of resources from different sources.
--------------------------------------------------------------
CommandBar for .NET
The CommandBar class library extends Windows Forms with classes for CommandBar, ReBar, CoolBar, and bitmaped menu controls. 24 bit alpha channel images are supported on Windows 2000
--------------------------------------------------------------
Writer for .NET
Writer is a simple WYSIWYG editor for HTML files. The program allows you to edit HTML files using simple editing functionality like Undo, Redo, Cut, Copy, Paste, Find, Replace. Writer also supports text layout and formatting, hyperlink editing and insertion of dates and pictures.
--------------------------------------------------------------
Mapack for .NET
Mapack is a .NET class library for basic linear algebra computations. It supports Norm1, Norm2, Frobenius Norm, Determinant, Infinity Norm, Rank, Condition, Trace, Cholesky, LU, QR, single value decomposition, least squares solver and eigenproblems.
--------------------------------------------------------
جهت دانلود برنامه ها به اینجا مراجعه نمایید
موفق باشید
-
لیست تمامی Shortcut های Visual Studio 2005 & 2008
می تونین لیست تمامی Shortcut های موجود در Visual Studio 2005 رو از اینجا دانلود کنین:
Visual Studio .NET 2005 C# Keybinding
و برای دوستانی که Visual Studio .NET 2008 استفاده می کنند:
Visual Studio .NET 2008 C# Keybinding
-
به دست آوردن لیست کاربران یک گروه خاص در سیستم
برای اینکه بتونین لیست کاربرانی که عضو گروه خاصی هستند رو به دست بیارین از این کد استفاده کنین:
DirectoryEntry localMachine = new DirectoryEntry( "WinNT://"+
Environment.MachineName);
DirectoryEntry admGroup = localMachine.Children.Find(txtGroupName.Text, "group");
object members = admGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
DirectoryEntry member = new DirectoryEntry(groupMember);
Console.WriteLine("UserName: {0}",member.Name);
}