আমি কীভাবে বর্তমান লাইন নম্বর পেতে পারি?


117

আমি কী করতে চাই তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

MessageBox.Show("Error line number " + CurrentLineNumber);

উপরের কোডে CurrentLineNumberকোডের এই টুকরোটির উত্স কোডের লাইন নম্বর হওয়া উচিত।

আমি এটা কিভাবে করবো?


আপনি নির্ভরযোগ্যভাবে এটি করতে পারবেন না , কারণ জেআইটি সংকলক অপ্টিমাইজেশন করতে পারে (উদাহরণস্বরূপ ইনলাইনিং কোড), আপনার লাইনের নম্বরগুলি ভুল হবে।
এপ্রিল এডিয়ানব্যাঙ্কস

1
আপনি চাইলে অপ্টিমাইজেশন বন্ধ করতে পারেন, তাই আপনি নির্ভরযোগ্যভাবে এটি করতে পারেন
jwg

উত্তর:


175

.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]যা আপনি আসল কোড ফাইলের পাথ বলে।


ধন্যবাদ উত্তরের জন্য অনেক. নামও কি শেখানো সম্ভব? ওহ আমি অন্য কিছু নিয়ে বিভ্রান্ত আমি কি আশ্চর্য হ'ল এএসপিএন 4.5 ওয়েবসাইট। গ্লোবাল ত্রুটি ক্যাচার। ত্রুটির কারণে বস্তুর নাম ধরা?
মনস্টার এমএমআরপিজি

পুনঃটুইট করুন আমি উপরে উল্লিখিত 3 টি
মার্ক গ্র্যাভেল

1
@ মার্কগ্রাভেল এর জন্য কি রান টাইম এনভায়রনমেন্টও 4.5 বা হওয়া উচিত বা এটি একটি সংকলক বৈশিষ্ট্য?
কুলদীপ

5
সি # এত ভালভাবে ডিজাইন করা হয়েছে। এটি আমাকে অবাক করে দেওয়া কখনও থামে না। ধন্যবাদ মার্ক!
nmit026

74

স্ট্যাকফ্রেম.গেটফাইলাইন নম্বর পদ্ধতিটি ব্যবহার করুন , উদাহরণস্বরূপ:

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এবং ডিফল্ট মান থাকতে হবে। পদ্ধতির পরামিতিগুলিতে এই বৈশিষ্ট্যগুলি নির্দিষ্ট করে সংকলককে সংকলনের সময় কলিং কোডে যথাযথ মান সন্নিবেশ করানোর নির্দেশ দেয়, যার অর্থ এটি অবসন্নতার মাধ্যমে কাজ করে। আরও তথ্যের জন্য কলার তথ্য দেখুন ।


@ মনস্টার এমএমওরপিজি এটির ত্রুটি আছে কিনা তা নির্বিশেষে কাজ করে। স্ট্যাকফ্রেম ক্লাসটি স্রষ্টাকে মৃত্যুদন্ড কার্যকর করার পদ্ধতিটি দেখছে। স্ট্যাকফ্রেম নির্মাণকারীর কাছে প্রথম যুক্তি হ'ল কল গভীরতা (1) এবং দ্বিতীয় যুক্তি নির্দেশ করে যে ফাইলের তথ্য প্রয়োজন।
অ্যাকটন

3
আপনি কম্পাইল থাকেন StackFrameউদাহরণ স্বরূপ মনো , নিশ্চিত করুন হতে ব্যবহার--debug কম্পাইল সময়ে এবং রান টাইম এ
বার্নার্ড পল

StackFrame.NET কোর পাওয়া যায় না। মার্ক গ্র্যাভেলের উত্তরটি ব্যবহার করুন।
জেসি চিশল্ম

ডিফল্ট মান ব্যবহার করে = string.Emptyত্রুটি ছুঁড়েছে "'কলিংফিলপাথ'-এর জন্য ডিফল্ট প্যারামিটার মান অবশ্যই একটি সংকলন-সময় ধ্রুবক হতে হবে" !
stomy

1
@ স্টমির পরিবর্তে আমি নমুনা [টির ""পরিবর্তে ডাবল কোটস ব্যবহার করতে ) টি পরিবর্তন করেছি string.Empty
অ্যাকটন

21

আমি একটি লাইনার তাই পছন্দ করি:

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();

8
এটি .pdb ফাইল প্রয়োজন .. যা আমরা সাধারণত উত্পাদন সার্ভারে তৈরি / অনুলিপি করি না।
দীপক শর্মা

4

তাদের জন্য। নেট 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)

এখানে দেখুন!

আপনার পছন্দসই কনসোলটি.রাইটলাইন বিন্যাসটি পরিবর্তন করুন!


3
সমস্ত ক্ষেত্রে কাজ করবে না .. এটি সর্বদা .pdb ফাইলের প্রয়োজন, যা আমরা সাধারণত উত্পাদন সার্ভারে তৈরি / অনুলিপি করি না। সি # 5.0 কলার * বৈশিষ্ট্য দিয়ে চেষ্টা করুন।
দীপক শর্মা

2
আপনি যদি পরিবর্তে এটি ব্যবহার করেন: System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));তবে আপনি আউটপুট উইন্ডোতে লাইনটি ক্লিক করতে পারেন এবং উত্সের সেই লাইনে তোলা যেতে পারেন।
জেসি চিশল্ম

3

যদি এটি চেষ্টা করে তবে এটি ব্যবহার করুন block

try
{
    //Do something
}
catch (Exception ex)
{
    System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
    Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}

1

.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());

এটি মার্ক গ্রাভেলের দুর্দান্ত উত্তরের উপর ভিত্তি করে চলছে।


এটি সঠিক লাইনের নম্বরটি দেয় না। এটি কোনও কারণে সঠিকভাবে পেতে আমাকে 191 বিয়োগ করতে হয়েছে।
ড্যানিয়েল

মজাদার. আমার জন্য এখানে কাজ করে। আপনার কি আইডিইতে লিঙ্ক নম্বর চালু আছে? আপনি যদি ফাইলটির বিভিন্ন স্থান থেকে এই ফাংশনটি কল করেন তবে আপনার কি এখনও 191 বিয়োগ করতে হবে? এটি হয় একটি সংকলক বাগ (অসম্ভব, তবে সম্ভব) বা আপনার পৃষ্ঠায় ধসে পড়া ব্লক (লাইন নম্বরগুলি সঠিক হতে বাধা দেওয়া উচিত নয় এমন ক্ষেত্রে এটি লাইন নম্বরটি সন্ধান করার পরিবর্তে গণনা করা হলে পার্থক্যটি ব্যাখ্যা করতে পারে)। আপনি যদি আমার সাথে অফলাইনে যোগাযোগ করতে পারেন তবে আমি এর নীচে যেতে চাই।
ব্রায়ান ক্রিয়ার

কোনও ধসে অবরুদ্ধ ব্লক নেই, লাইন নম্বরগুলি চালু নেই, সেখান থেকে যে কোনও ফোন এসেছে তা নির্বিশেষে ১৯১ টি বিয়োগ করতে হবে। আমি জানি ... অদ্ভুত
ড্যানিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.