بایگانی

Archive for مارس 2010

CopySourceAsHTML

مارس 30, 2010 ۱ دیدگاه

چند وقتی هست که وبلاگم رو راه انداختم اما از همون اول دنبال پلاگین Syntax Highlighter برای وردپرس میگشتم.البته این به خاطر این بود که تب Plugin در wordpress.com فعال نیست. بعد از کلی گشت و گذار تو wordpress.com ایمیلی به مدیران wordpress زدم که این پلاگین رو حداقل برام نصب کنن که البته جواب درست حسابی داده نشد و گفتن که به خاطر مسائل امنیتی و غیره نمیتونن این کار را برام انجام بدن تا اینکه یکی از دوستان در یک کامنتی CopySourceAsHTML را پیشنهاد کرد که ازشون تشکر میکنم.

این Add-In یک ابزار قدرتمند برای وبلاگ هاو وبسایت هاست که شما میتوانید کدهای نوشته شده در Visual Studio را به همان شکل در پست هایتان بگذارید.ابتدا این add-in را از اینجا دانلود کنید و آن را نصب کنید.وقتی آن را نصب کردید گزینه ای به راست کلیک در VS اضافه خواهد شد.طریقه کار با آن به اینگونه است که ابتدا کد مورد نظر خود را که می خواهید در وبلاگتان بگذارید را انتخاب و روی آن راست کلیک کنید.

پس از انتخاب copy as html مطابق شکل بالا، دیالوگ این add-in نمایان خواهد شد.

پس از اینکه تنظیمات را انجام دادید کلید OK را بزنید.کدهای HTML تولید شده در Clipboard ذخیره خواهند شد و شما میتوانید ازآنها در وبلاگ یا وبسایت خودتان استفاده کنید.

این مطلب برای تشکر از دوستی نوشته شد که این Add-In را معرفی کردند که البته هیچ نام و یا مشخصه ای هم برجای نگداشته بودند.امیدوارم برای دیگر دوستان وبلاگ نویس هم مفید باشد.

موفق باشید/

Vote on iDevCenter

Advertisements
دسته‌ها:Visual Studio برچسب‌ها: , , ,

Singleton Pattern

مارس 27, 2010 4 دیدگاه

Singleton یکی از الگوهای معمولی است که بسیاری از برنامه نویسان ازآن به وفور استفاده می کنند.هدف از این الگو این است که اطمینان حاصل شود که از یک کلاس فقط یک نمونه وجود داشته باشد.این نوع الگو می تواند در موارد زیادی مفید باشد از جمله:

  • وقتی منابع بار زیادی داشته باشند مانند Linq Data Context
  • برنامه های چند نخی که ممکن است در نخ های دیگر سعی به ایجاد نمونه دیگری ازکلاس مورد نظر باشد
  • Global Resources
  • و موارد زیادی از این قبیل

در یک کلاس Singleton دو چیز مورد نیاز خواهد بود:

  1. یک متغیر private static که نمونه مورد نظر از کلاس را نگه می دارد
  2. یک متد static که این نمونه را برمی گرداند

البته این موارد به موارد زیر جهت بهبود الگو تغییر پیدا میکنند:

  1. یک سازنده private که البته اگر این سازنده static باشد بهتر است
  2. یک متغیر private static که نمونه مورد نظر از کلاس را نگه می دارد
  3. یک پروپرتی public static که این نمونه را برمی گرداند

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

1 public class SingletonPattern

2 {

3 private SingletonPattern() { }

4

5 private static SingletonPattern instance = new SingletonPattern();

6 public static SingletonPattern GetInstance

7 {

8 get

9 {

10 return instance;

11 }

12 }

13 }

و نحوه فراخوانی آن هم به شکل زیر خواهد بود:

1 SingletonPattern s = SingletonPattern.GetInstance;

خوب همانطور که از این نحوه پیاده سازی پیداست، متغیر ما static است.یعنی فقط یکبار ایجاد خواهد شد.برای اینکه این موضوع را متوجه بشوید اجازه بدید دو نمونه از این کلاس ایجاد کنیم:

1 SingletonPattern s1 = SingletonPattern.GetInstance;

2 SingletonPattern s2 = SingletonPattern.GetInstance;

اگرچه این کد دو نمونه متفاوت را ایجاد میکند، اما هردو نمونه به یک شی ارجاع داده می شوند.کد زیر این مسئله را نشان میدهد:

1 public class Program

2 {

3 public static void Main(string[] args)

4 {

5 SingletonPattern s1 = SingletonPattern.GetInstance;

6 SingletonPattern s2 = SingletonPattern.GetInstance;

7

8 if (s1 == s2)

9 Console.WriteLine(«Refer to the same object»);

10

11 Console.ReadLine();

12 }

13 }

اما الگویی که تا الان ما طراحی کردیم thread-safe نخواهد بود.یعنی ممکن است نخ دیگری همزمان اقدام به ایجاد کلاس کند.یک راه این است که ایجاد کلاس را lock کنید.به کد زیر توجه کنید:

1 public class SingletonPattern

2 {

3 private SingletonPattern() { }

4

5 private static SingletonPattern instance = new SingletonPattern();

6 public static SingletonPattern GetInstance

7 {

8 get

9 {

10 lock (typeof(SingletonPattern))

11 {

12 if (instance != null)

13 instance = new SingletonPattern();

14 }

15 return instance;

16 }

17 }

18

19 }

اما مشکلی که این روش دارد این است که احتمال وقوع بن بست را افزایش خواهد داد.بهترین راه برای این کار Lazy Instantiation خواهد بود.در این روش نمونه گیری از کلاس Singleton در یک کلاس تودرتو (Nested Class) انجام میشود.

1 public class SingletonPattern

2 {

3 private SingletonPattern() { }

4

5 class SingletonCreator

6 {

7 private static SingletonCreator() { }

8 internal static readonly SingletonPattern instance =

9 new SingletonPattern();

10 }

11

12 public static SingletonPattern GetInstance

13 {

14 get

15 {

16 return SingletonCreator.instance;

17 }

18 }

19

20 }

نکته ای که می توان به آن اشاره کرد این است که در Perfoemance این روش نسبت به روش قبل کارایی بیشتری دارد.

Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , , ,

سازنده ها، سازنده های static و مخرب ها در وراثت

یکی ازمسائلی که در وراثت بسیاری از برنامه نویسان را گیج میکند سازنده ها و مخرب ها هستند.در این مقاله کوتاه به بررسی و توضیح این مسئله می پردازیم:

  • سازنده ها به ترتیب از پدر به فرزند شروع به اجرا می کنند. یعنی ابتدا پدر ساخته میشه و بعد فرزند(طبیعتا تا پدری نباشد فرزندی هم نخواهد بود)
  • مخرب ها برعکس خواهد بود.یعنی از فرزند به پدر اجرا خواهند شد.ابتدا مخرب در فرزند اجرا و بعد در پدر اجرا خواهد شد(فکر میکنید چرا به این شکل است؟ جواب: از همون قانونی که در نکته قبل ضمیمه کردم استفاده کنید ببینید چرا بدین شکل اجرا می شوند)
  • نحوه اجرای سازنده های static کاملا متفاوت است.این سازنده به محض اینکه یک شی به وجود می آیند ایجاد و دیگر هیچ وقت اجرا نخواهند شد.این سناریو کمی گیج کننده است.این سناریو به این شکل هست که وقتی شما یک نمونه از کلاس فرزند را به وجود می آورید، سازنده static آن ابتدا اجرا خواهد شد و سپس سازنده static کلاس پدرو بعد از آن نیز هیچ وقت اجرا نخواهند شد.

اجازه بدید با یک مثال این مسئله رو بهتر متوجه می شویم.

public class A

{

public A()

{

Console.WriteLine(«A public constructor»);

}

static A()

{

Console.WriteLine(«A Static Constructor»);

}

~A()

{

Console.WriteLine(«A Destructor»);

}

}

public class B : A

{

public B()

{

Console.WriteLine(«B public constructor»);

}

static B()

{

Console.WriteLine(«B Static Constructor»);

}

~B()

{

Console.WriteLine(«B Destructor»);

}

}

در تابع اصلی آنها را به این صورت به کار خواهیم برد:

public class Program

{

public static void Main(string[] args)

{

B b1 = new B();

B b2 = new B();

b1 = b1 = null;

GC.Collect();

Console.ReadLine();

}

}

از null کردن نمونه ها و GC.Collect() برای نشان دادن اجرای مخرب کلاس ها استفاده کردیم.خروجی به شکل زیر خواهد بود:

مسئله ای که در اینجا می توان بیشتر توضیح داد و شاید دلیل اصلی ایجاد این پست، سازنده های static هستند.این سازنده ها به محض دادن هر ارجاعی به کلاس ساخته خواهند شد.این مسئله را می توانید در مثال زیر بهتر متوجه شوید:

public class A

{

public A()

{

Console.WriteLine(«A public constructor»);

}

static A()

{

Console.WriteLine(«A Static Constructor»);

}

~A()

{

Console.WriteLine(«A Destructor»);

}

public static void TestMethod()

{

//Some code here

}

}

public class Program

{

public static void Main(string[] args)

{

A.TestMethod();

Console.ReadLine();

}

}

با توجه به تعریفی که کردیم با فراخوانی ()A.TestMethod سازنده static اجرا خواهد شد لذا خروجی به شکل زیر خواهد بود:

اما چرا سازنده های static ؟

جواب (و همچنین اطلاعات بیشتر) در msdn

Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: ,

تاثیر class selector روی performance در JQuery

مارس 23, 2010 ۱ دیدگاه

نکته ای که در مورد JQuery لازم است بدانید مربوط به performance می باشد.برای انتخاب یک کلاس شما می توانید از سه روش استفاده کنید :

  1. $ (‹.myclass›)
  2. $ (‹p.myclass›)
  3. $ (‹.myclass.otherclass›)

اگر در جایی از این Framework استفاده می کنید که سرعت و performance برای شما اهمیت زیادی دارد بهتر است از روش دوم برای دسترسی به یک کلاس استفاده کنید.چون این روش یک تابع native را در جاوااسکریپت اجرا میکند(getElementsByTagName) که در اینجا JQuery یک فیلتر خواهد داشت و فقط در بین تگهای <p> کلاس مورد نظر را جستجو خواهد کرد.اما این درباره روش های دیگر طور دیگری خواهد بود و JQuery تابع getElementsByClassName() را اجرا خواهد کرد که در این صورت هر عنصری از DOM مورد جستجو قرار خواهد گرفت که این مسئله می تواند در سرعت تاثیر بگذارد.البته این تفاوت سرعت بستگی به پیچیدگی صفحه و تعداد المنت های DOM خواهد داشت.

بطور کلی نیازی به تمرکز به این سطح از بهینه سازی نیست و شما می توانید از آن صزف نظرکنید اما یادتان باشد که شما در محیط Web دارید برنامه نویسی می کنید نه ویندوز.

Vote on iDevCenter

دسته‌ها:JQuery, Performance برچسب‌ها: ,

JQuery Intellisense For Dreamweaver

یکی از امکاناتی که یک می تواند یک IDE را قدرتمند کند وجود یک Intellisense در آن است.IDE هایی مثل Visual Studio و Dreamweaver که درآنها کدنویسی میکنم در این زمینه قدرتمند هستند.ولی Dreamwaver کمی محدودتر است.مخصوصا در کدنویسی در محیط جاوا که محدودیت های زیادی دارد.اما با پدید آمدن JQuery Framework احساس نیاز به این امکان در این IDE بیشتر احساس میشه.برای این منظور شما می توانید از این extension استفاده کنید.


Extension را دانلود کنید و برای نصب آن می توانید از Extension Manager که همراه با Dreamweaver نصب میشود استفاده کنید. شما همچنین می توانید به این ابزار در منوی Commands و گزینه Manage Extensions در Dreamweaver دسترسی داشته باشید.

لینک دانلود extension


Vote on iDevCenter

دسته‌ها:JQuery برچسب‌ها: , ,

Extension Methods

این نوع متدها که یکی از ویژگی هایی است که در C# 3.0 ارائه شده است به شما اجازه خواهند داد که شما به یک نوع موجود، متدهایی را اضافه کنید بدون اینکه از یک نوع مشتق شده استفاده کنید، یا اینکه یک کامپایل مجدد داشته باشید و یا اینکه آن نوع را به طرز جدیدی اصلاح کنید.این مفهوم به شما اجازه خواهد داد تا متدهایی را به کلاس هایی اضافه کنید که ممکن است حتی سورس کد انها را نداشته باشید.
شما هر نوعی را که گسترش دهید، با داشتن یک نمونه (Instance) از آن می توانید این متد را فراخوانی کنید.یک مزیت  Extension Methods وقتی است که شما یک کلاس sealed داشته باشید و قصد گسترش آن را داشته باشید.

در ابتدا اجازه دهید متدهای static را بررسی کنیم.

اگرچه این کد به خوبی کار میکند اما همانطور که مشاهده میکنید نوشتن آن کمی مشکل خواهد بود.

برای اینکه این کد را ساده کنیم می توانیم از Extension Method استفاده کنید. و اما مشخصات اینگونه متدها:

  • این نوع متدها در کلاس های static پایه ریزی می شوند و با استفاده از نمونه های نوع مربوطه فراخوانی می شود.
  • خود متد static است.
  • اولین پارامتر این متد(پارامتر instance یا نمونه)، نوعی است که قصد گسترش آن را داریم و با کلمه کلیدی this تعریف می شود.
  • پارامتر instance نمی تواند از نوع اشاره گر باشد.
  • پارامتر instance نمی تواند با استفاده از ref, out و … امضا شود.در نتیجه این پارامتر نباید با مرجع فراخونی شود.
  • این متد باید public, internal و private باشد.بهتر است که public باشد.
  • این متدهای فقط در محدوده namespaceی هستند که در آن تعریف شده اند.

در اینجا نتیجه با مثال قبل یکسان خواهد بود ولی تفاوتی که با آن دارد این است که فراخوانی آن ساده تر و کدهای نوشته شده به این حالت قابل درک و جامع تر خواهند بود.

اما اجازه دهید آن را از لحاظ MSIL(Microsoft Intermediate Language) بررسی کنیم.

همانطور که در شکل بالا مشاهده می کنید کدی که ما نوشتیم در IL به فراخوانی یک متد ساده static ترجمه شده است.و این به این معنی است که Extension Method چیزی زیادتر از یک متد static نیست. اما کامپایلر چگونه میفهمد که این متد یه Extension Method است؟

همانطور که مشاهده می کنید در فراخوانی این متد در تابع Main این متد با صفت ExtensionMethods مشخص شده است.بنابراین کامپایلر خواهد فهمید که این متد در حقیقت یک Extension Method است.

اما تفاوت دیگری که اینگونه متد ها دارند این است که شما قادر خواهید بود در Intellisense آنها را مشاهده کنید.این متدها همانطور که در شکل می بینید به این صورت مشاهده خواهند شد:

  • یک فلش رو به پایین
  • دربرداشتن رشته (extension) در tooltipی که متد را معرفی میکند

نکته آخر هم درباره استفاده از این متدها در LINQ است که اگر با LINQ آشنایی داشته باشد میدانید که از Extension Methods در LINQ زیاد استفاده می شود.


Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , ,

سال نو مبارک

سال 1388 هم داره تموم میشه و داریم به لحظه سال تحویل نزدیک میشیم.باورم نمیشه که اینقدر زود امسال گذشت.برنامه های زیادی داشتم که اکثرشون رو نتونستم انجام بدم.

به هر حال امیدوارم امسال سال بسیار خوبی برای همه ایرانیان و من باشه.مدت زیادی به آخر سال نمونده.الان که دارم تایپ میکنم 19:06 دقیقه هست و لحظه سال تحویلم ساعت 21:02 دقیقه …

HaPpY nEw YEAR

تا سال دیگه بای…

دسته‌ها:Uncategorized