সি # তে আইফডিফ


116

আমি নীচে কিন্তু সি ++ এর পরিবর্তে সি # তে করতে চাই

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
c# 

পরীক্ষা করে দেখুন এই চমৎকার উত্তর পাশাপাশি, কিভাবে এটি আপনার প্রকল্পের ফাইল (.csproj) মাধ্যমে অবস্থার উপর ভিত্তি করে ডিবাগ চিহ্ন যোগ করতে পারেন দেখায়।
— ম্যাট

উত্তর:


162
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

আপনার বিল্ড বৈশিষ্ট্যগুলিতে চেক করা DEBUG সংজ্ঞায়িত করতে আপনার কাছে চেকবক্স রয়েছে তা নিশ্চিত করুন Make


51

আমি আপনাকে শর্তসাপেক্ষ বৈশিষ্ট্যটি ব্যবহার করে সুপারিশ করব !

আপডেট: 3.5 বছর পরে

আপনি এটির#if মতো ব্যবহার করতে পারেন ( উদাহরণটি এমএসডিএন থেকে অনুলিপি করা ):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !VC_V7)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
        Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
        Console.WriteLine("DEBUG and VC_V7 are defined");
#else
        Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
    }
}

শুধুমাত্র পদ্ধতির অংশগুলি বাদ দেওয়ার জন্য দরকারী।

আপনি যদি #ifসংকলন থেকে কিছু পদ্ধতি বাদ দিতে চান তবে আপনাকে সেই সমস্ত কোডের টুকরোটি সংকলন থেকে বাদ দিতে হবে যা সেই পদ্ধতিটিকেও কল করে (কখনও কখনও আপনি রানটাইমের সময় কিছু ক্লাস লোড করতে পারেন এবং "সমস্ত রেফারেন্সগুলি সন্ধান করুন" সহ কলার খুঁজে পাবেন না)। অন্যথায় ত্রুটি হবে।

আপনি যদি অন্যদিকে শর্তসাপেক্ষ সংকলন ব্যবহার করেন তবে আপনি এখনও কোডের সমস্ত টুকরো ছেড়ে দিতে পারেন যা পদ্ধতিটিকে কল করে। সমস্ত পরামিতি এখনও সংকলক দ্বারা বৈধ করা হবে। রানটাইমটিতে কেবল পদ্ধতিটি কল করা হবে না । আমি মনে করি যে পদ্ধতিটি একবারে আড়াল করা আরও ভাল এবং সেই সাথে যে কোডটি কল করে সেগুলিও সরাতে হবে না। আপনাকে যে পদ্ধতিগুলি মান দেয় কেবলমাত্র শূন্য পদ্ধতিতে শর্তযুক্ত বৈশিষ্ট্য ব্যবহার করার অনুমতি নেই। তবে আমি এটি একটি বড় সীমাবদ্ধতা বলে মনে করি না কারণ আপনি যদি #ifএমন কোনও পদ্ধতি ব্যবহার করেন যা কোনও মূল্য ফেরত দেয় তবে আপনাকে কোডের সমস্ত টুকরোগুলি লুকিয়ে রাখতে হবে।

এখানে একটি উদাহরণ:

    // কলিং ক্লাস 1. শর্তসাপেক্ষে মেথড () রানটাইম এড়ানো হবে 
    // যতক্ষণ না DEBUG ধ্রুবক সংজ্ঞায়িত করা হয়


    System.Diagnostics ব্যবহার করে;
    ক্লাস ক্লাস 1 
    {
       [শর্তসাপেক্ষ ( "ডিবাগ")]
       পাবলিক স্ট্যাটিক শূন্য শর্তসাপেক্ষে মেঠোড () {
          কনসোল.ওরাইটলাইন ("এক্সিকিউটেড ক্লাস 1।কন্ডিশনাল ম্যাথোদ");
       }
    }

সারসংক্ষেপ:

আমি #ifdefসি ++ এ ব্যবহার করব তবে সি # / ভিবি দিয়ে আমি শর্তযুক্ত বৈশিষ্ট্য ব্যবহার করব। আপনি যে কোডটির কল করেন সেটিকে টুকরো টুকরো না করে আপনি পদ্ধতি সংজ্ঞাটি গোপন করেন। কলিং কোডটি এখনও সংকলক দ্বারা সংকলিত এবং বৈধ হয়েছে, যদিও রানটাইমটিতে পদ্ধতিটি কল করা হয় না। #ifনির্ভরতা এড়াতে আপনি ব্যবহার করতে পারেন কারণ শর্তসাপেক্ষে আপনার কোডটি এখনও সংকলিত রয়েছে।


1
+1 এটি সত্যিই দুর্দান্ত তবে এর সীমাবদ্ধতা রয়েছে যেমন আপনি যখন শর্তযুক্ত পদ্ধতি থেকে কোনও মান ফেরত দেওয়ার চেষ্টা করেন (যেমন আমি এটি বুঝতে পারি)। একটি অন্তর্নিহিত উদাহরণ সাহায্য করবে, আমি মনে করি।
— হামিশ গ্রুবিজন

1
এটি কোডটি সংকলিত হতে বাধা দেয় না, এটি কেবল সেই কোডটিকে অনুমতি দেয় না। পার্থক্য গুরুত্বপূর্ণ যখন আপনি নির্ভরতা এবং এই জাতীয় অপসারণ করতে চান।
— লি লুভিয়ের

1

সি # এর একটি প্রিপ্রোসেসর রয়েছে। এটি সি ++ এবং সি এর চেয়ে কিছুটা আলাদাভাবে কাজ করে

এখানে একটি এমএসডিএন লিঙ্ক রয়েছে - সমস্ত প্রিপ্রোসেসর নির্দেশাবলীর বিভাগ ।


11
এটি একটি ছোটখাটো বিষয়, তবে সি # এর কোনও প্রিপ্রসেসর নেই। # নির্দেশনাগুলি প্রধান সংকলক দ্বারা প্রক্রিয়া করা হয় যেন কোনও প্রিপ্রসেসর রয়েছে। এখানে দেখুন: এমএসডিএন.মাইক্রোসফট /en-us/library/ed8yd1ha.aspx এই পার্থক্যের মূল ফলাফলটি হ'ল সি / সি ++ স্টাইলের ম্যাক্রোগুলি কাজ করে না।
— সাইমন পি স্টিভেন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.