यहाँ एक उदाहरण है कि मैं क्या करना चाहता हूँ:
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 लाइन (SomeMethodSomewhere) पर
वहाँ भी है [CallerFilePath]
जो आपको मूल कोड फ़ाइल का पथ बताता है।
उदाहरण के लिए StackFrame.GetFileLineNumber विधि का उपयोग करें :
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
स्कॉट हैनेलमैन की ब्लॉग प्रविष्टि देखें में अधिक जानकारी के लिए।
[संपादित करें: निम्नलिखित जोड़ा गया]
का उपयोग करने वालों के लिए .net 4.5 या बाद में, पर विचार करें , System.Runtime.CompilerServices नाम स्थान में CallerFilePath , CallerMethodName और CallerLineNumber विशेषताओं पर । उदाहरण के लिए:
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 Core में उपलब्ध नहीं है। मार्क ग्रेवेल के उत्तर का उपयोग करें।
= string.Empty
त्रुटि "कॉलिंग फ़ाइलपैथ के लिए डिफ़ॉल्ट पैरामीटर मान" एक संकलन-समय स्थिर होना चाहिए " !
""
) का उपयोग करने के लिए परीक्षा [le को बदल दिया string.Empty
।
मुझे एक लाइनर पसंद है:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
जिनके लिए .NET 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)
इधर देखो!
Console.WriteLine स्वरूप को आप कैसे पसंद करते हैं बदलें
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
तो आप आउटपुट विंडो में लाइन पर क्लिक कर सकते हैं और स्रोत में उस लाइन पर ले जाया जा सकता है।
अगर इसकी एक कोशिश पकड़ने ब्लॉक में इस का उपयोग करें।
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());
यह मार्क ग्रेवेल के उत्कृष्ट जवाब पर बन रहा है।