কাস্টম সংকলক সতর্কতা


115

In ObsoleteAtribute ব্যবহার করার সময়। নেট এটি আপনাকে কম্পাইলার সতর্কতা দেয় যে অবজেক্ট / পদ্ধতি / সম্পত্তি অপ্রচলিত এবং অন্য কিছু ব্যবহার করা উচিত telling আমি বর্তমানে এমন একটি প্রকল্পে কাজ করছি যার প্রাক্তন কর্মচারী কোডটি প্রচুর পরিমাণে পুনঃনির্মাণের প্রয়োজন। আমি একটি কাস্টম বৈশিষ্ট্য লিখতে চাই যা আমি যে পদ্ধতিগুলি বা বৈশিষ্ট্যগুলি চিহ্নিত করতে ব্যবহার করতে পারি যা আমার লেখা বার্তাগুলি দেয় সংকলক সতর্কতা জেনারেট করে। এটার মতো কিছু

[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub

আমি এটি একটি সংকলক সতর্কতা উত্পন্ন করতে চাই যাতে বলা হয়, "এই কোডটি সুক্স এবং এটিকে দেখা উচিত"। আমি জানি কীভাবে একটি কাস্টম বৈশিষ্ট্য তৈরি করতে হয়, প্রশ্নটি হল আমি কীভাবে এটি ভিজ্যুয়াল স্টুডিওতে সংকলক সতর্কতা জেনারেট করি।


এটি কি সি #? আমি মূলত পোস্টারটি বাছাই করতে চাইলে অনুমান হিসাবে এটি সি # (সি নয়) হিসাবে পুনরায় চালু করতে যাচ্ছি।
ওনোরিও ক্যাটেনাচি

13
এটি বৈধ ভিবি বা সি # নয় ... তবে এটি কী ... !?
ljs

5
পুরানো প্রশ্ন, তবে আপনি এখন রোজলিন ব্যবহার করে কাস্টম সংকলক সতর্কতা সংজ্ঞায়িত করতে পারেন।
আরজে কুথার্টসন

4
@ জড়ুমেল রোজলিনের ভাষণে, কোড বিশ্লেষকগণ: জনকোনারার
আরজে কুথবার্টসন

2
@ আরজেকুবার্টসন আমি আপনার মন্তব্যটিকে এটির প্রাপ্য মনোযোগ দেওয়ার জন্য গৃহীত উত্তরের দিকে নিয়ে গিয়েছি।
jpaugh

উত্তর:


27

হালনাগাদ

রোজলিন (ভিজ্যুয়াল স্টুডিও 2015) দিয়ে এটি এখন সম্ভব। আপনি একটি কাস্টম বৈশিষ্ট্য যাচাই করতে একটি কোড বিশ্লেষক তৈরি করতে পারেন


আমি বিশ্বাস করি না এটি সম্ভব। অপসোলেটএট্রিবিউট বিশেষভাবে সংকলক দ্বারা চিকিত্সা করা হয় এবং সি # স্ট্যান্ডার্ডে সংজ্ঞায়িত হয়। কেন পৃথিবীতে অপ্রচলিতচরিত গ্রহণযোগ্য নয়? আমার কাছে মনে হচ্ছে এটি হ'ল অবিকল পরিস্থিতি যা এটির জন্য ডিজাইন করা হয়েছিল এবং আপনার যা প্রয়োজন ঠিক তা অর্জন করে!

এছাড়াও নোট করুন যে ভিজ্যুয়াল স্টুডিও ফ্লোতেও ওসোলেলেটএট্রিবিউটের দ্বারা উত্পন্ন সতর্কতাগুলি তুলে ধরে, যা খুব দরকারী।

অপ্রয়োজনীয় হওয়ার অর্থ নয়, কেবল আপনি কেন এটি ব্যবহার করতে আগ্রহী না তা ভাবছেন ...

দুর্ভাগ্যক্রমে অপ্রচলিত এট্রিবিউট সিল করা হয়েছে (সম্ভবত বিশেষ চিকিত্সার কারণে আংশিক কারণে) সুতরাং আপনি এটি থেকে নিজের বৈশিষ্ট্যটি সাবক্লাস করতে পারবেন না।

সি # স্ট্যান্ডার্ড থেকে:

অপসৃত বৈশিষ্ট্যটি প্রকারগুলি এবং প্রকারের সদস্যদের চিহ্নিত করতে ব্যবহৃত হয় যা আর ব্যবহার করা উচিত নয়।

যদি কোনও প্রোগ্রাম কোনও প্রকার বা সদস্য ব্যবহার করে যা অপ্রচলিত গুণাবলী দিয়ে সজ্জিত হয় তবে সংকলকটি একটি সতর্কতা বা ত্রুটি জারি করে। বিশেষত, কোনও ত্রুটি পরামিতি সরবরাহ না করা থাকলে, বা যদি ত্রুটির পরামিতি সরবরাহ করা হয় এবং মানটি মিথ্যা থাকে তবে সংকলকটি একটি সতর্কতা জারি করে। ত্রুটি পরামিতি নির্দিষ্ট করা থাকলে এবং মানটি সত্য হলে সংকলকটি একটি ত্রুটি জারি করে।

এটি কি আপনার প্রয়োজনগুলি যোগ করে না? ... আপনি যা ভাবেন না তার চেয়ে ভাল আপনি করতে পারবেন না।


14
আমি একই জিনিস খুঁজছি। অপ্রচলিত 'কাজ করে' তবে রিফ্যাক্টরিংয়ের কারণে কোডটি আসলে এতটা অসম্পূর্ণ নয়।
ছ।

11
আমি @ জি এবং সম্ভবত মূল লেখকের সাথে একমত অপ্রচলিত অর্থ অপ্রচলিত, ব্যবহার করবেন না। আমি "আরে এই সংকলনগুলি হিসাবে কিছু চিহ্নিত করতে চাই তবে আমাদের সত্যই হয় একটি) কার্যকারিতা সম্পূর্ণ করতে হবে বা খ) রিফ্যাক্টর"। এটি একটি ডেভেলপমেন্ট সময়ের গুণাবলী বেশি হবে of এছাড়াও টাস্কগুলি কাজ করে, উদাহরণস্বরূপ // TODO :, তবে আমি অনুমান করি যেহেতু অনেক লোক তা করেন না, তবে নিয়মিত সংকলক সতর্কতা পর্যালোচনা করেন।
মাইকজ্যানসেন

8
[Obsolete]ট্যাগটি ব্যবহার না করার আরেকটি কারণ হ'ল যদি আপনাকে সম্পত্তিটির সাথে এক্সএমএলসিরাইজেশন করার দরকার হয় তবে সমস্যা হতে পারে। [Obsolete]ট্যাগ যুক্ত [XmlIgnore]করা পর্দার পিছনে বৈশিষ্ট্য যুক্ত করে ।
বার্নটোস্ট 11

6
অপ্রচলিত আলাদা। অপ্রচলিত আপনাকে কোডের প্রতিটি লাইনে একটি সতর্কতা দেবে যা সেই পদ্ধতিটি কল করে। আমি মনে করি না যে পোস্টারটি এটি চায় (কমপক্ষে এটি আমি চাই না যখন আমি অনুসন্ধান করে এই প্রশ্নটি পেয়েছিলাম)। আমি ভেবেছিলাম যে প্রশ্নটি যা খুঁজছিল তা হ'ল কোনও ফাংশনের সংজ্ঞাটি প্রদর্শন করার জন্য একটি সতর্কতার জন্য, এটি ব্যবহৃত হচ্ছে না that
নিক

সবচেয়ে বড় উত্তর নয়। -1 আপনার অক্ষমতা ভেবে কারণ এটি ব্যবহার না করার কারণ নিয়ে আসে come এই মনোভাব সত্যতা নিরুৎসাহিত করে।
মাইক সোখা তৃতীয়

96

এটি একটি চেষ্টা মূল্য।

আপনি অপ্রচলিতকে প্রসারিত করতে পারবেন না, কারণ এটি চূড়ান্ত, তবে সম্ভবত আপনি নিজের বৈশিষ্ট্য তৈরি করতে পারেন এবং সেই শ্রেণিকে এভাবে অপ্রচলিত হিসাবে চিহ্নিত করতে পারেন:

[Obsolete("Should be refactored")]
public class MustRefactor: System.Attribute{}

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

আপডেট: এই কোডটি দিয়ে এটি একটি সতর্কতা উত্পন্ন করে (খুব সুন্দর নয়, তবে আমি এর চেয়ে ভাল কিছু মনে করি না)।

public class User
{
    private String userName;

    [TooManyArgs] // Will show warning: Try removing some arguments
    public User(String userName)
    {
        this.userName = userName;   
    }

    public String UserName
    {
        get { return userName; }
    }
    [MustRefactor] // will show warning: Refactor is needed Here
    public override string ToString()
    {
        return "User: " + userName;
    }
}
[Obsolete("Refactor is needed Here")]
public class MustRefactor : System.Attribute
{

}
[Obsolete("Try removing some arguments")]
public class TooManyArgs : System.Attribute
{

}

এটি কি উত্পন্ন করে তা পেস্ট করতে পারেন? আমি কৌতুহলী.
মাইকা

1
সংস্থান সতর্কতা সম্পত্তি / পদ্ধতি না বলা হলেও ট্রিগার করা হয় not
রল্ফ ক্রিস্টেনসেন

1
এখানে ভাল পরামর্শ। আমি একই জিনিসটি করতে চাইছিলাম, এবং কেবল নোটইম্প্লেটেডএক্সেপশন নিক্ষেপ করলাম। সংকলনের সময় তারা প্রদর্শিত না হওয়ায় সেরা সমাধান নয়, কেবল রানটাইমেই কোডটি কার্যকর করা হয়। আমি নিজে চেষ্টা করে দেখব।
MonkeyWunch

1
ওবসোলটিআট্রিবিউট ঠিক তেমনি ডিবাগারডিসপ্লেঅ্যাট্রিবিউটের মতো অভিব্যক্তিগুলিকে সমর্থন করতে পারলে দুর্দান্ত হত না, তবে আমরা সত্যিই কিছু দুর্দান্ত জিনিস করতে পারি। ভিজ্যুষ্টুডিও.ইউসারওয়াইজ
121579-

আপনি যদি IDisposableসেই অপ্রচলিত ক্লাসগুলিতে প্রয়োগ করেন তবে এর অর্থ আপনি আপনার ডজি টেস্ট কোডটি একটি usingব্লকে মোড়ানো করতে পারেন । ভালো: using(new MustRefactor()){DodgyCode();}। আপনার কাজ শেষ হয়ে গেলে আপনি সমস্ত ব্যবহারগুলি সন্ধান করতে পারেন। আমি এখনই এটিকে Sleepলুপের অভ্যন্তরে থ্রেডে ব্যবহার করছি ডিবাগিংয়ের উদ্দেশ্যে কৃত্রিমভাবে আমার মন্থর করতে হবে slow
আইয়েন ফ্রেজার

48

কিছু সংকলকগুলিতে আপনি সতর্কতা জারি করতে # তাত্পর্য ব্যবহার করতে পারেন:

#warning "Do not use ABC, which is deprecated. Use XYZ instead."

মাইক্রোসফ্ট সংকলকগুলিতে, আপনি সাধারণত বার্তা প্রাগমা ব্যবহার করতে পারেন:

#pragma message ( "text" )

আপনি উল্লেখ করেছেন। নেট, কিন্তু আপনি সি / সি ++ বা সি # দিয়ে প্রোগ্রামিং করছেন কিনা তা নির্দিষ্ট করে নি। আপনি যদি সি # তে প্রোগ্রামিং করছেন তবে আপনার জানা থাকা উচিত যে সি # # বিভাজন ফর্ম্যাটটিকে সমর্থন করে


1
# তাত্পর্য বা #pragma প্রাক-প্রসেসরের নির্দেশিকা এবং এটি মাইকার প্রাক্তন সহকর্মীদের কোডের যে কোনও উপস্থিতি বিবেচনা না করেই চলবে এবং এটি বৈশিষ্ট্যের সাথে মোটেই ইন্টারেক্ট করে না। বেশ কিছু নির্দিষ্ট অপ্রচলিত এটি অর্জনের একমাত্র মাধ্যম ...
ljs

39

আমরা বর্তমানে অনেক রিফ্যাক্টরিংয়ের মাঝখানে রয়েছি যেখানে আমরা এখনই সবকিছু ঠিক করতে পারি না। আমরা কেবল # বিড়াল প্রিপ্রোক কমান্ডটি ব্যবহার করি যেখানে আমাদের ফিরে যেতে হবে এবং কোডটি দেখতে হবে। এটি সংকলক আউটপুট প্রদর্শিত হবে। আমি মনে করি না আপনি এটি কোনও পদ্ধতিতে রাখতে পারেন তবে আপনি এটি কেবল পদ্ধতির ভিতরে রাখতে পারেন এবং এটি এখনও খুঁজে পাওয়া সহজ।

public void DoEverything() {
   #warning "This code sucks"
}

7

ভিএস ২০০৮ (+ এসপি ১) তে # সতর্কতা পরিষ্কার সমাধান এবং পুনর্নির্মাণ সমাধানের পরে ত্রুটি তালিকায় সঠিকভাবে প্রদর্শিত হয় না, তাদের কোনওটিই নয়। কিছু নির্দিষ্ট সতর্কতা কেবলমাত্র নির্দিষ্ট শ্রেণীর ফাইলটি খোলার পরেই ত্রুটি তালিকায় প্রদর্শিত হয়। সুতরাং আমি কাস্টম বৈশিষ্ট্যটি ব্যবহার করতে বাধ্য হয়েছিলাম:

[Obsolete("Mapping ToDo")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class MappingToDo : System.Attribute
{
    public string Comment = "";

    public MappingToDo(string comment)
    {
        Comment = comment;
    }

    public MappingToDo()
    {}
}

সুতরাং যখন আমি এটি দিয়ে কিছু কোড পতাকা

[MappingToDo("Some comment")]
public class MembershipHour : Entity
{
    // .....
}

এটি এর মতো সতর্কতা উত্পন্ন করে:

নেমস্পেস.ম্যাপিং টুডো অপ্রচলিত: 'ম্যাপিং টুডো'।

আমি সতর্কতার পাঠ্যটি পরিবর্তন করতে পারি না, 'কিছু মন্তব্য' এটি ত্রুটি তালিকা দেখানো হয়নি। তবে এটি ফাইলের যথাযথ জায়গায় চলে যাবে। সুতরাং আপনার যদি এই জাতীয় সতর্কতা বার্তাগুলি পরিবর্তনের প্রয়োজন হয় তবে বিভিন্ন বৈশিষ্ট্য তৈরি করুন।


6

আপনি যা করতে চেষ্টা করছেন তা হল গুণাবলীর অপব্যবহার। পরিবর্তে ভিজ্যুয়াল স্টুডিও টাস্ক তালিকাটি ব্যবহার করুন। আপনি আপনার কোডটিতে একটি মন্তব্য লিখতে পারেন:

//TODO:  This code sux and should be looked at
public class SuckyClass(){
  //TODO:  Do something really sucky here!
}

তারপরে মেনু থেকে View / Task list খুলুন open কার্য তালিকায় দুটি বিভাগ, ব্যবহারকারীর কাজ এবং মন্তব্য রয়েছে। মন্তব্যে স্যুইচ করুন এবং আপনি আপনার // টোডো: এর সমস্ত দেখতে পাবেন। একটি টোডোতে ডাবল ক্লিক করা আপনার কোডের মন্তব্যে চলে যাবে।

আল


1
আমি এটি আরও পছন্দসই সমাধানটি খুঁজে
স্যামুয়েল

1
আপনি যদি কোনও ফাংশনটিকে "উত্পাদন কোডে ডাকা হবে না" বা অনুরূপ হিসাবে চিহ্নিত করতে চান তবে কী হবে। সুতরাং আপনি চান যদি এটি কোনও ফাংশন বা শ্রেণি কল করা বা ইনস্ট্যান্টিয়েটেড করা হয় তবে এটি কেবল সংকলন করা নয়।
জেসি মরিচ

2

আমি মনে করি না আপনি পারবেন। যতদূর আমি জানি যে অপ্রচলিতঅ্যাট্রিবিউটের সমর্থনটি মূলত সি # সংকলকটিতে হার্ডকোডযুক্ত; আপনি সরাসরি অনুরূপ কিছু করতে পারবেন না।

আপনি যা করতে সক্ষম হতে পারেন তা হ'ল একটি এমএসবিল্ড টাস্ক (বা একটি বিল্ড-পরবর্তী ইভেন্ট) ব্যবহার করুন যা স্রেফ-সংকলিত সমাবেশের বিরুদ্ধে একটি কাস্টম সরঞ্জাম কার্যকর করে tool কাস্টম সরঞ্জামটি সমাবেশে সমস্ত ধরণের / পদ্ধতিগুলির মধ্যে প্রতিফলিত করে এবং আপনার কাস্টম বৈশিষ্ট্যটি গ্রাস করবে, যার ফলে এটি সিস্টেমে মুদ্রণ করতে পারে C কনসোলের ডিফল্ট বা ত্রুটিযুক্ত পাঠ্য লেখক।


2

জন্য উৎস এ খুঁজছি ObsoleteAttribute , এটা দেখাচ্ছে না মত এটি একটি কম্পাইলার সতর্কবার্তা জেনারেট করতে বিশেষ কিছু করছে, তাই আমি @ সঙ্গে যেতে ঝোঁক হবে technophile এবং বলে যে এটা হার্ড কোডেড কম্পাইলার মধ্যে হয়। আপনার সতর্কতা বার্তাগুলি উত্পন্ন করতে আপনি কেবলমাত্র অপসৃতঅ্যাট্রিবিউট ব্যবহার করতে চান না এমন কোনও কারণ আছে ?


কোড ব্যতীত কোনও বিশেষ কারণ অগত্যা অপ্রচলিত নয়।
মাইকা

1
এটি সি # স্পেসিফিকেশনে নির্দিষ্ট করে সংকলক দ্বারা বিশেষভাবে বিবেচনা করা হচ্ছে, আমার উত্তরটি দেখুন :-) check মিকা - 'প্রচ্ছন্ন অপ্রচলিত বৈশিষ্ট্যগুলি টাইপ এবং ধরণের সদস্যদের চিহ্নিত করতে ব্যবহৃত হয় যা আর ব্যবহার করা উচিত নয়' ' স্পেসিফিকেশন থেকে। এটি কি প্রযোজ্য নয়? ...
ljs

কেউ যদি অবাক হন, সোর্স কোডে এটি করার জন্য কোনও সি # কোড নেই। রেফারেন্সসোর্স.মাইক্রোসফট.কম
##mscorlib

1

বেশ কয়েকটি মন্তব্য রয়েছে যা সতর্কতা বা প্রাগমা সন্নিবেশ করার পরামর্শ দেয়। অপ্রচলিত একটি খুব ভিন্ন উপায়ে কাজ! একটি লাইব্রেরি এল এর ক্রিয়াকলাপকে অপ্রচলিত হিসাবে চিহ্নিত করা, অপ্রচলিত বার্তাটি উত্থাপিত হয় যখন কোনও প্রোগ্রাম ফাংশনটি কল করে এমনকি কলার প্রোগ্রামটি লাইব্রেরিতে না থাকলেও এল। সংকলন করা হয় কেবল সতর্কতা বার্তাটি উত্থাপন করে।


1

এখানে রোজলিন বাস্তবায়ন, যাতে আপনি নিজের বৈশিষ্ট্য তৈরি করতে পারেন যা ফ্লাইতে সতর্কতা বা ত্রুটি দেয়।

আমি টাইপ কল একটি বৈশিষ্ট্য তৈরি করেছি IdeMessageযা সতর্কতা উত্পন্ন করে এমন বৈশিষ্ট্যটি হবে:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class IDEMessageAttribute : Attribute
{
    public string Message;

    public IDEMessageAttribute(string message);
}

এটি করার জন্য আপনাকে প্রথমে রোজলিন এসডিকে ইনস্টল করতে হবে এবং বিশ্লেষক দিয়ে একটি নতুন ভিএসআইএক্স প্রকল্প শুরু করতে হবে। আমি বার্তাগুলির মতো কিছু কম প্রাসঙ্গিক টুকরো বাদ দিয়েছি, কীভাবে এটি করবেন তা আপনি বুঝতে পারেন। আপনার বিশ্লেষকটিতে আপনি এটি করেন

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression);
}

private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context)
{
    var invocation = (InvocationExpressionSyntax)context.Node;

    var methodDeclaration = (context.SemanticModel.GetSymbolInfo(invocation, context.CancellationToken).Symbol as IMethodSymbol);

    //There are several reason why this may be null e.g invoking a delegate
    if (null == methodDeclaration)
    {
        return;
    }

    var methodAttributes = methodDeclaration.GetAttributes();
    var attributeData = methodAttributes.FirstOrDefault(attr => IsIDEMessageAttribute(context.SemanticModel, attr, typeof(IDEMessageAttribute)));
    if(null == attributeData)
    {
        return;
    }

    var message = GetMessage(attributeData); 
    var diagnostic = Diagnostic.Create(Rule, invocation.GetLocation(), methodDeclaration.Name, message);
    context.ReportDiagnostic(diagnostic);
}

static bool IsIDEMessageAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType)
{
    var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName);

    var result = attribute.AttributeClass.Equals(desiredTypeNamedSymbol);
    return result;
}

static string GetMessage(AttributeData attribute)
{
    if (attribute.ConstructorArguments.Length < 1)
    {
        return "This method is obsolete";
    }

    return (attribute.ConstructorArguments[0].Value as string);
}

এর জন্য কোনও কোডফিক্সপ্রভাইডার নেই আপনি এটি সমাধান থেকে সরাতে পারেন।

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