ورودی غیر معمول در C#
با سلام در حین یادگیری سی شارپ به چنین کدی بر خوردم که برام یه مقداری عجیب بود میشه راهنمایی کنید که این کد با توجه به اصول زبان سی شارپ چه را این طور نوشته شده.
<c#>
public static log4net.ILog GetLoger([CallerFilePath]string filename = "")
{
return log4net.LogManager.GetLogger(filename);
}
<c#>
4 پاسخ
سلام
این مربوط به بحث پیاده سازی interface ها به صورت implicite و explicit (ضمنی و صریح) می باشد
کد فوق هم یک پیاده سازی explicit برای اینترفیس می باشد
از مهمترین کاربردهای پیاده سازی explicit، امکان پیاده سازی چند interface با اعضای هم نام در یک کلاس است
مثلا فرض کنید دو تا اینترفیس ISMSNotify و IEmailNotify دارید و درون هر دوی این اینترفیس ها یک متد (عضو) با نام send دارید و حال می خواهید در یک کلاسی که از هر دوی این اینترفیس ها ارث بری کرده اند این متد را پیاده سازی نمایید
حال بهترین راه حل استفاده از پیاده سازی صریح (explicit) اینترفیس توسط برنامه نویس است
مطلب آموزش شی گرایی در سی شارپ توضیحات خوب و کاملی داره و می تونه کمک تون کنه
دوست عزیز این پیاده سازی اینترفیس نیست این یه متد که یه خروجی داره که خروجیش یه اینترفیسه که تو فضای نام log4net قرار داره. مشکل من با خروجیش نیست مشکل من با اون ورودی اولشه نه مشخصه string و نه مشخصه attribute.
CallerFilePath یک attribute اما نمدونم چرا بعدش یه string اومده.
ممنون از راهنماییتون.
من را ببخشید
چون در عکسی که از کدتون قرار داده بودید log4net.ILog را بصورت سرهم و به عنوان اینترفیس دیدم و متد GetLogger را هم متد آن
اما در مورد ویژگی [CallerFilePath] باید بگم که یک Attribute است و از ویژگی های جدید است که در C# 5.0 معرفی شد و فقط در زمان کامپایل کاربرد دارد و به درد برنامه نویس می خورد
این Attribute در فضای نام System.Runtime.CompilerServices قرار دارد و مسیر کاملی از جایی که آنرا فراخوانی نموده است را بر میگرداند
در فضای نام فوق چند Attribute وجود دارد
[CallerMemberName] // نام متدی که متد ما را صدا زده را بر می گرداند [CallerFilePath] // مسیر کامل (درایو/فولدرها/پروژه/کلاس) را بر میگرداند. [CallerLineNumber] // اطلاعاتی از شماره خط محل صدا کننده متد می دهد
البته باید پارامتر متدی که از این Attribute استفاده می کند حتما مقدار پیش فرض داشته باشد ولی در فراخوانی متد تاثیری ندارد
GetLoger([CallerFilePath]string filename = "") یا GetLoger([CallerFilePath]string filename = null)
به عنوان مثال کامل که تست کردم
public static void Main() { ShowCallerInfo(); Console.ReadKey(); } public static void ShowCallerInfo( [CallerMemberName] string callerName = null, [CallerFilePath] string callerFilePath = null, [CallerLineNumber] int callerLine = -1) { Console.WriteLine("Caller Name: {0}", callerName); Console.WriteLine("Caller FilePath: {0}", callerFilePath); Console.WriteLine("Caller Line number: {0}", callerLine); } // خروجی Caller Name: Main Caller FilePath: d:\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1\Class1.cs Caller Line number: 7