আমি কী করতে চাই তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
MessageBox.Show("Error line number " + CurrentLineNumber);
উপরের কোডে CurrentLineNumber
কোডের এই টুকরোটির উত্স কোডের লাইন নম্বর হওয়া উচিত।
আমি এটা কিভাবে করবো?
আমি কী করতে চাই তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
MessageBox.Show("Error line number " + CurrentLineNumber);
উপরের কোডে CurrentLineNumber
কোডের এই টুকরোটির উত্স কোডের লাইন নম্বর হওয়া উচিত।
আমি এটা কিভাবে করবো?
উত্তর:
.NET 4.5 / C # 5 এ, নতুন কলার বৈশিষ্ট্যগুলি ব্যবহার করে এমন একটি ইউটিলিটি পদ্ধতি লিখে আপনার জন্য এই কাজটি করার জন্য আপনি সংকলকটি পেতে পারেন:
static void SomeMethodSomewhere()
{
ShowMessage("Boo");
}
...
static void ShowMessage(string message,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
MessageBox.Show(message + " at line " + lineNumber + " (" + caller + ")");
}
এটি প্রদর্শিত হবে, উদাহরণস্বরূপ:
39 লাইনে বুও (সামোথড কোথাও কোথাও)
এর রয়েছে [CallerFilePath]
যা আপনি আসল কোড ফাইলের পাথ বলে।
স্ট্যাকফ্রেম.গেটফাইলাইন নম্বর পদ্ধতিটি ব্যবহার করুন , উদাহরণস্বরূপ:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
দেখুন স্কট Hanselman এর ব্লগ এন্ট্রি আরও তথ্যের জন্য।
[সম্পাদনা করুন: নিম্নলিখিত যুক্ত করেছেন]
নেট 4.5 বা পরবর্তী ব্যবহার করছেন তাদের জন্য, বিবেচনা CallerFilePath , CallerMethodName এবং CallerLineNumber System.Runtime.CompilerServices নামস্থানে বৈশিষ্ট্যাবলী। উদাহরণ স্বরূপ:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
আর্গুমেন্ট হতে হবে string
জন্য CallerMemberName
এবং CallerFilePath
একটি এবং int
জন্য CallerLineNumber
এবং ডিফল্ট মান থাকতে হবে। পদ্ধতির পরামিতিগুলিতে এই বৈশিষ্ট্যগুলি নির্দিষ্ট করে সংকলককে সংকলনের সময় কলিং কোডে যথাযথ মান সন্নিবেশ করানোর নির্দেশ দেয়, যার অর্থ এটি অবসন্নতার মাধ্যমে কাজ করে। আরও তথ্যের জন্য কলার তথ্য দেখুন ।
StackFrame
উদাহরণ স্বরূপ মনো , নিশ্চিত করুন হতে ব্যবহার--debug
কম্পাইল সময়ে এবং রান টাইম এ
StackFrame
.NET কোর পাওয়া যায় না। মার্ক গ্র্যাভেলের উত্তরটি ব্যবহার করুন।
= string.Empty
ত্রুটি ছুঁড়েছে "'কলিংফিলপাথ'-এর জন্য ডিফল্ট প্যারামিটার মান অবশ্যই একটি সংকলন-সময় ধ্রুবক হতে হবে" !
""
পরিবর্তে ডাবল কোটস ব্যবহার করতে ) টি পরিবর্তন করেছি string.Empty
।
আমি একটি লাইনার তাই পছন্দ করি:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
তাদের জন্য। নেট 4.0+ পদ্ধতির সমাধান প্রয়োজন:
using System;
using System.IO;
using System.Diagnostics;
public static void Log(string message) {
StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
string fileName = stackFrame.GetFileName();
string methodName = stackFrame.GetMethod().ToString();
int lineNumber = stackFrame.GetFileLineNumber();
Console.WriteLine("{0}({1}:{2})\n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}
কিভাবে কল করবেন:
void Test() {
Log("Look here!");
}
আউটপুট:
অকার্যকর পরীক্ষা () (FILENAME.cs: 104)
এখানে দেখুন!
আপনার পছন্দসই কনসোলটি.রাইটলাইন বিন্যাসটি পরিবর্তন করুন!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
তবে আপনি আউটপুট উইন্ডোতে লাইনটি ক্লিক করতে পারেন এবং উত্সের সেই লাইনে তোলা যেতে পারেন।
যদি এটি চেষ্টা করে তবে এটি ব্যবহার করুন block
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
.NET 4.5 এ আপনি ফাংশনটি তৈরি করে লাইন নম্বরটি পেতে পারেন:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
তারপরে আপনি যখনই কল LineNumber()
করবেন তখন আপনার বর্তমান লাইন থাকবে। স্ট্যাকট্রেস ব্যবহার করে যে কোনও সমাধানের ক্ষেত্রে এটির সুবিধা রয়েছে যা এটি ডিবাগ এবং রিলিজ উভয় ক্ষেত্রেই কাজ করা উচিত।
সুতরাং যা প্রয়োজন তার মূল অনুরোধ গ্রহণ করা, এটি হয়ে উঠবে:
MessageBox.Show("Error enter code here line number " + LineNumber());
এটি মার্ক গ্রাভেলের দুর্দান্ত উত্তরের উপর ভিত্তি করে চলছে।