সি # তে সতর্কতা "কখনও ব্যবহার করা হয় না" এবং "কখনই বরাদ্দ করা হয় না" দমন করা


107

সি # প্রকল্পে আমার কাছে একটি HTTPS systemm Definitions.cs ফাইল রয়েছে যা মূলত পরিচালিত কোড দ্বারা গ্রাহকের জন্য পুরানো উইন্ডোজ ISAPI বর্ণনা করে।

এটি ISAPI এর সাথে প্রাসঙ্গিক কাঠামোর সম্পূর্ণ সেট অন্তর্ভুক্ত করে বা কোড দ্বারা গ্রাস করা হয় না। সংকলনে এই কাঠামোগুলির সমস্ত ফিল্ড সদস্য নীচের মতো একটি সতর্কতা সৃষ্টি করছে: -

সতর্কতা ক্ষেত্র 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' কখনই বরাদ্দ করা হয় না এবং সর্বদা এর ডিফল্ট মান বাতিল হয়

অথবা

সতর্কতা ক্ষেত্র 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' কখনই ব্যবহৃত হয় না

এগুলি দিয়ে কি অক্ষম করা যায় #pragma warning disable? যদি তাই হয় তবে ত্রুটিযুক্ত নম্বরগুলি কী হবে? না থাকলে আর কিছু করতে পারি? মনে রাখবেন যে এই ফাইলটির জন্য আমি কেবল কী করব, এটি গুরুত্বপূর্ণ যে আমি অন্যান্য ফাইল থেকে এই জাতীয় সতর্কতা পেতে পারি।

সম্পাদন করা

উদাহরণ কাঠামো:

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader;
    internal SetHeaderDelegate SetHeader;
    internal AddHeaderDelegate AddHeader;

    UInt32  HttpStatus;               // New in 4.0, status for SEND_RESPONSE
    UInt32  dwReserved;               // New in 4.0
}

আপনি কি সেই ক্ষেত্রগুলির ঘোষণাপত্র প্রদর্শন করতে পারেন, বা বরং তারা যে কাঠামোটিতে আছেন সেগুলি? অর্থাত। একটি উদাহরণ দিন.
লাসে ভি কার্লসেন

11
যদি এগুলি আন্তঃব্যক্তির সংজ্ঞা হয়, তবে সাধারণত আপনি [StructLayout(LayoutKind.Sequential)]মেমরির লেআউটটি সঠিক কিনা তা নিশ্চিত করতে চান (বর্তমান বাস্তবায়নে এটি এই বৈশিষ্ট্যটি ছাড়াই হবে তবে এএফআইএকি এটির গ্যারান্টিযুক্ত নয়)। যদি আমি সঠিকভাবে মনে রাখি, সি # সংকলক এই বৈশিষ্ট্যের উপস্থিতি সনাক্ত করে এবং স্বয়ংক্রিয়ভাবে সেই সতর্কতাগুলিকে দমন করে কারণ এটি জানে ক্ষেত্রগুলি ইন্টারপ করার জন্য থাকতে হবে। (আমি এই সম্পর্কে ভুল হতে পারি, সুতরাং উত্তরের পরিবর্তে একটি মন্তব্য হিসাবে পোস্ট করা)।
গ্রেগ বিচ

@ গ্রেগ: এটি দরকারী তথ্য যা আমি তদন্ত করব আমি সতর্কতাটি দমন করার পরিবর্তে উত্পন্ন করা উচিত নয়।
অ্যান্থনিডাব্লু জোন্স

1
ব্যবহারের জন্য +1 StructLayout। এগুলি সতর্কতাগুলি দমন করার চেয়ে পরিষ্কার মনে হয়।
ডান্না

@ গ্রেগবিচ আপনি ঠিক বলেছেন! এটি এখনও VS2017 এ .NET স্ট্যান্ডার্ড প্রকল্পগুলির জন্য প্রযোজ্য।
zwcloud

উত্তর:


195

হ্যাঁ, এগুলি দমন করা যায়।

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

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

দ্বিতীয়টি হ'ল ভুলভাবে ব্যবহৃত ক্ষেত্রগুলির জন্য একটি কোড-গন্ধ। উদাহরণস্বরূপ, আপনি ভুলভাবে কোনও সম্পত্তির নতুন মানটি সম্পত্তিটিতে ফিরে লিখতে পারেন, ব্যাকিং ফিল্ডে কখনও লিখবেন না।


" ফিল্ড এক্সওয়াইজেড কখনই ব্যবহৃত হয় না " এর জন্য সতর্কতা দমন করতে , আপনি এটি করুন:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169

" ফিল্ড এক্সওয়াইজেডকে কখনই বরাদ্দ করা হয় না এবং সর্বদা এর ডিফল্ট মান XX থাকে " এর জন্য সতর্কতা দমন করতে , আপনি এটি করুন:

#pragma warning disable 0649
... field declaration
#pragma warning restore 0649

এই জাতীয় সতর্কতা নম্বরগুলি নিজে খুঁজে পেতে (যেমন, আমি কীভাবে 0169 এবং 0649 ব্যবহার করতে জানলাম), আপনি এটি করুন:

  • কোডটি স্বাভাবিক হিসাবে সংকলন করুন, এটি ভিজ্যুয়াল স্টুডিওতে আপনার ত্রুটি তালিকায় কিছু সতর্কতা যুক্ত করবে
  • আউটপুট উইন্ডো এবং বিল্ড আউটপুটটিতে স্যুইচ করুন এবং একই সতর্কতার জন্য অনুসন্ধান করুন
  • প্রাসঙ্গিক বার্তা থেকে 4-সংখ্যার সতর্কতা কোডটি অনুলিপি করুন, যা দেখতে এটির মতো হওয়া উচিত:

    সি: \ দেব \ ভিএস.এনইটি \ কনসোল অ্যাপ্লিকেশন ১৯ \ কনসোল অ্যাপ্লিকেশন ১৯ \ প্রোগ্রাম.cs (10,28): সতর্কতা সিএস 0649 : ফিল্ড 'কনসোল অ্যাপ্লিকেশন 19.Program.dwRemitted' কখনই বরাদ্দ করা হয় না এবং সর্বদা এর ডিফল্ট মান 0 থাকে


কেভেট : @ জনা হান্নার মন্তব্য অনুসারে , এই প্রশ্ন এবং উত্তরের ভবিষ্যত সন্ধানকারীদের জন্য সম্ভবত কিছু সতর্কতা রয়েছে এটির জন্য।

  • প্রথম এবং সর্বাগ্রে, একটি সতর্কতা দমন করার কাজটি মাথা ব্যথার জন্য পিলগুলি গ্রাস করার অনুরূপ। অবশ্যই, কখনও কখনও এটি করা সঠিক জিনিস হতে পারে তবে এটি ক্যাচ-অল সলিউশন নয়। কখনও কখনও, মাথাব্যথা হ'ল সত্য উপসর্গ যা আপনাকে মাস্ক করা উচিত নয়, সতর্কতার সাথে একই। বিল্ড আউটপুট থেকে কেবল অন্ধভাবে সরানোর পরিবর্তে সতর্কতাগুলির কারণগুলি স্থির করে চিকিত্সা করার চেষ্টা করা সর্বদা সেরা best
  • এটি বলার পরে, যদি আপনার কোনও সতর্কতা দমন করতে হয় তবে আমি উপরে উল্লিখিত প্যাটার্নটি অনুসরণ করুন। প্রথম কোড লাইন, সেই ফাইলটির বাকি অংশের জন্য বা কমপক্ষে কোনও সম্পর্কিত না পাওয়া পর্যন্ত #pragma warning disable XYZKসতর্কতাটি অক্ষম করে । আপনি এই সতর্কতাগুলিকে অক্ষম করেছেন এমন লাইনের সংখ্যা হ্রাস করুন। উপরের প্যাটার্নটি কেবলমাত্র এক লাইনের জন্য সতর্কতাটি অক্ষম করে।#pragma warning restore XYZK
  • এছাড়াও, জনের উল্লেখ হিসাবে, আপনি কেন এটি করছেন তা সম্পর্কে একটি মন্তব্য একটি ভাল ধারণা। সতর্কতা নিষ্ক্রিয় করা অবশ্যই কোনও কারণ-ছাড়াই করা হলে একটি কোড-গন্ধ এবং ভবিষ্যতে রক্ষণাবেক্ষণকারীরা কেন এটি করেছেন তা ভেবেই সময় কাটাতে বা আটকাবে এবং এমনকি এটি সরিয়ে দিয়ে এবং সতর্কতাগুলি ঠিক করার চেষ্টা করে will

9
আমি উপরের উত্তর আরও বলতে চাই, যে অক্ষম পরিধি যতটা সম্ভব ছোট হিসাবে (এটা কোথাও নিষ্ক্রিয় যেখানে এটি উপকারী এড়াতে) হতে এবং সবসময় আপনার কেন নিষ্ক্রিয় করা হয়, যেমন হিসেবে একটি মন্তব্য সঙ্গে একটি নিষ্ক্রিয় সংসর্গে //exists for interopমধ্যে এই ক্ষেত্রে.
জন হান্না

অনেক ধন্যবাদ. এটি একটি আশ্চর্যজনক পছন্দ যে ভিএস ত্রুটি তালিকা উইন্ডোতে এই সংখ্যাগুলির জন্য একটি কলাম অন্তর্ভুক্ত করে না।
অ্যান্থনিডাব্লু জোন্স

2
জোন যেমন বলেছিলেন, "কেন" মন্তব্য করা খুব গুরুত্বপূর্ণ। তদতিরিক্ত, আমি সাধারণত মন্তব্যে সতর্কতা বার্তার পাঠ্যের কমপক্ষে কিছু অংশ যুক্ত করি যেমন // দমন "কখনই বরাদ্দ করা হয় না ..." সতর্কতা। ভবিষ্যতের রক্ষণাবেক্ষণকারীদের সতর্কতা কোডটি সন্ধান করার বিরক্তি রক্ষা করুন - সর্বোপরি, এটি আপনার হতে পারে!
টম বুশেল

1
এটি তাত্ক্ষণিকভাবে সুস্পষ্ট নয় তবে আপনি সিটিআরএল + এফের মাধ্যমে আউটপুট উইন্ডোতে ফাইন্ড ব্যবহার করতে পারেন, "সতর্কতা" টাইপ করুন, "সমস্ত সন্ধান করুন" এ ক্লিক করুন এবং সতর্কতা সংখ্যার সাথে প্রদর্শিত প্রতিটি সতর্কতা দ্রুত পান। এটি বলেছিল [StructLayout(LayoutKind.Sequential)]যে প্রশ্নটিতে গ্রেগ বিচের মন্তব্য অনুসারে বৈশিষ্ট্যটি ইন্টারপকে আরও ভালভাবে পরিচালনা করে।
রায়ান বুডিকোম

2
ইউনিটি 3 ডি ব্যবহারকারীদের জন্য মন্তব্য করার জন্য, সতর্কতা নম্বরগুলি ব্যক্তিগত ক্ষেত্রের জন্য 0414 এবং স্থানীয় ভেরিয়েবলের জন্য 0219, 169 নয় (যা পরিবর্তে সতর্কতাটি পুনরুদ্ধার করতে অক্ষম সম্পর্কে সতর্কতা ছুড়ে দেয়)।
ড্রাকো 18s আর

14

এই সতর্কতাগুলি ঠিক করার জন্য আরেকটি "সমাধান" হ'ল স্ট্রাক্ট তৈরি করা public। সতর্কবাণীগুলি তখন জারি করা হয় না কারণ সংকলকটি সমাবেশের বাইরে ক্ষেত্রগুলি (নির্ধারিত) ব্যবহৃত হচ্ছে কিনা তা জানতে পারে না।

তাই বলা হয়, "Interop" উপাদান সাধারণত পাবলিক থাকা উচিত নয়, বরং internalবা private


2
নিস, এটি লুকান সতর্কবার্তা নেই ... কিন্তু এই ধরনের একটি সেটিং structযেমন publicসম্ভাবনা বেশি সতর্কতা আমরা মাস্ক করার চেষ্টা করছেন তুলনায় ভুল হতে হয়। (আপনার সম্ভবত অভ্যন্তরীণ বাস্তবায়নের জন্য অকারণে ব্যবহৃত প্রকারগুলি এবং পাবলিক ফিল্ডগুলির প্রকারগুলি সম্ভবত কোনও পাবলিক এপিআইতে অন্তর্ভুক্ত নয়) should কেবল আপনার পরামর্শকে আরও জোরদার করতে যে এই ধরণেরগুলি "পরিবর্তে " internalবা private";-) হওয়া উচিত ।
বিনকি

দুর্দান্ত ধন্যবাদ - এটি আমার প্রয়োজন ছিল। আমি ব্যবহার করছি JsonConvert.DeserializeObjectএবং আমি এমন একটি পাবলিক ক্লাসে ডিেসরিয়াল করছি যাতে সমস্ত বৈশিষ্ট্যই উন্মুক্ত রয়েছে যাতে আমি জানি কী ফিরে আসবে। সমস্ত জনসাধারণের স্ট্রিং দিয়ে খালি খালি এটিকে একটি সর্বজনীন বর্গ তৈরি করা দুর্দান্ত সংক্ষিপ্ত কোড এবং এখন আর কোনও সতর্কতা নেই। সম্ভবত একটি গতিশীল ক্লাস ব্যবহার করা আরও ভাল হবে কারণ আপনাকে স্পষ্টভাবে অ্যারেতে কী আছে তা জানাতে হবে না, তবে আমি মনে করি যে কেউ এই অবজেক্টটি ব্যবহারের প্রত্যাশায় এটির জন্য একটি দুর্দান্ত রেফারেন্স হবে।
ব্যবহারকারী 1274820

6

আমি বাস্তবায়নের কঙ্কাল তৈরির জন্য ভিএস পেয়েছি System.ComponentModel.INotifyPropertyChangedএবং ইভেন্টগুলি ক্ষেত্র হিসাবে বাস্তবায়িত হয়েছিল যা CS0067 সতর্কতাগুলিকে ট্রিগার করেছিল।

গৃহীত উত্তরের প্রদত্ত সমাধানের বিকল্প হিসাবে আমি ক্ষেত্রগুলিকে সম্পত্তিগুলিতে রূপান্তর করেছি এবং সতর্কতা অদৃশ্য হয়ে গেছে

সম্পত্তি ঘোষণার সিনট্যাক্স চিনির ক্ষেত্রটি আরও উল্লেখ করে যে ক্ষেত্রটি আরও উল্লেখ করা হয় এবং ক্ষেত্রের সাথে সম্পর্কিত গিটার এবং / অথবা সেটার পদ্ধতিগুলি (আমার ক্ষেত্রে যোগ / সরান) সংকলিত হয় sense এটি সংকলক সন্তুষ্ট এবং সতর্কতা উত্থাপিত হয় না:

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader {get;set;}
    internal SetHeaderDelegate SetHeader { get; set; }
    internal AddHeaderDelegate AddHeader { get; set; }

    UInt32 HttpStatus { get; set; }               // New in 4.0, status for SEND_RESPONSE
    UInt32 dwReserved { get; set; }               // New in 4.0
}

আপনার সমাধানটি সতর্কবার্তাটি অক্ষম করার চেয়ে অনেক মনোমুগ্ধকর তবে এটি কিছু ক্ষেত্র-কেবলমাত্র বৈশিষ্ট্যগুলিতে হস্তক্ষেপ করতে পারে, যেমন মার্শালএএস্যাট্রিবিউট।
হুবেজা

1
তথ্য: এই পরিস্থিতিতে উত্পন্ন প্রকৃত বেসরকারী ক্ষেত্রগুলিতে "অদ্ভুত" নাম থাকতে পারে <GetHeader>k__BackingField, ব্যবহৃত # # সংকলক প্রয়োগের বিবরণের উপর নির্ভর করে।
জেপ্প স্টিগ নীলসন

1

সি / সি ++ ব্যবহারকারীদের (void)var;অব্যবহৃত ভেরিয়েবলের সতর্কতাগুলি দমন করতে হবে। আমি সবেমাত্র আবিষ্কার করেছি যে আপনি বি # বা অপারেটরগুলির সাথে সি # তে অব্যবহৃত ভেরিয়েবলের সতর্কতাগুলিও দমন করতে পারেন:

        uint test1 = 12345;
        test1 |= 0; // test1 is still 12345

        bool test2 = true;
        test2 &= false; // test2 is now false

উভয় এক্সপ্রেশন VS2010 C # 4.0 এবং মনো 2.10 সংকলকগুলিতে অব্যবহৃত পরিবর্তনশীল সতর্কতা তৈরি করে না।


4
জন্য কাজ করে uint, তবে অন্যান্য ধরণের জন্য নয় Exception। আপনি কি সি / সি ++ এর সমতুল্য একটি জেনেরিক ট্রিক জানেন var;?
manuell

1
@ মানিউল ভবিষ্যত থেকে হ্যালো! আপনি error.ToString();টাইপের একটি ভেরিয়েবলের জন্য ব্যবহার করতে পারেনException
এসভি 443

এখন থেকে ধন্যবাদ। সেই কৌশলটি রানটাইমের সময় আসল কোড যুক্ত করে, তাই না?
manuell
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.