जेएमएल प्रलेखन में जेनेरिक कक्षाओं और विधियों को कैसे संदर्भित करें


198

जब आप उपयोग कर सकते हैं xml प्रलेखन लिखते हैं <see cref="something">something</see>, जो निश्चित रूप से काम करता है। लेकिन आप सामान्य प्रकार के साथ एक वर्ग या विधि का संदर्भ कैसे देते हैं?

public class FancyClass<T>
{
  public string FancyMethod<K>(T value) { return "something fancy"; }
}

अगर मैं कहीं xml प्रलेखन लिखने जा रहा था, तो मैं फैंसी वर्ग का संदर्भ कैसे दूंगा? मैं कैसे संदर्भ कर सकता हूं FancyClass<string>? विधि के बारे में क्या?

उदाहरण के लिए एक अलग वर्ग में मैं उपयोगकर्ता को यह बताना चाहता था कि मैं इसका एक उदाहरण वापस करूंगा FancyClass<int>। मैं उसके लिए एक देखने के लिए कैसे कर सकता हूँ?

जवाबों:


257

विधि का संदर्भ लेने के लिए:

/// <see cref="FancyClass{T}.FancyMethod{K}(T)"/> for more information.

3
उस उत्तर के लिए धन्यवाद! यह वास्तव में MSDN के पेज से गायब है <see>: msdn.microsoft.com/en-us/library/acd0tfbe.aspx
joce

6
मैं वास्तव में इसके लिए वीएस2010 टूलटिप्स में काम करने के लिए विश्वास करता हूं, आपको सामान्य तर्कों की संख्या को इंगित करने की आवश्यकता है, उदाहरण के लिए "फैंसीक्लास 1{T}.FancyMethod1 {के} (टी)"
स्टीफन ड्रू

नहीं यकीन है कि आप उस बारे में क्या मतलब है मुझे कभी भी उन लोगों को नहीं जोड़ना पड़ा है, और यह हमेशा मेरे लिए काम किया है। क्या आपके पास एक विशिष्ट उदाहरण है जहां यह काम नहीं करता है? यदि ऐसा है, तो कृपया इसे कहीं पोस्ट करें (या स्वयं भी एक उत्तर प्रदान करें।)
लास वी। कार्लसन

@ शेष, कृपया स्टीव के उत्तर और टिप्पणियों को नीचे देखें। आपका उत्तर सही Intellisense टूलटिप्स को कवर नहीं करता है।
जकुब जानुसज़िकविज़

43
/// <summary>Uses a <see cref="FancyClass{T}" /> instance.</summary>

BTW, यह .Net फ्रेमवर्क 2.0 और 3.0 के MSDN प्रलेखन में मौजूद था , लेकिन यह 3.5 संस्करण में गायब हो गया


4
टी के एक सहज उदाहरण के बारे में क्या? स्ट्रिंग की तरह? शायद संभव नहीं?
Svish

आपका मतलब क्या है? आप एक विशिष्ट संस्करण घोषित नहीं कर सकते, इसलिए आप इसे या तो संदर्भित नहीं कर सकते।
लास वी। कार्लसन

यदि उदाहरण के लिए कोई विधि केवल उदाहरण के लिए सूची <string> देता है। लेकिन महत्वपूर्ण नहीं :)
Svish

7
हाँ, मैं भी सोच रहा था ... जब फैनक्लास {स्ट्रिंग} लिख रहा हो, लेकिन स्क्वेगल्स, जब फैन्सीक्लास {स्ट्रिंग}} लिख रहा हो, तो नहीं ...
Thinkbeforecoding

6
"थिंकिंग बिफोर कोडिंग" द्वारा उपरोक्त अवलोकन का कारण यह है कि यह सी # उपनाम के साथ काम नहीं करता है। उदाहरण के लिए आपको Int32इसके बजाय उपयोग करने की आवश्यकता होती है int, आदि के Singleबजाय (इस जानकारी को यहां डालते हुए और कोई इस पर ठोकरfloat
खाता है

27

टी एल; डॉ:

"मैं कैसे संदर्भ दूंगा FancyClass<T>?"

   /// <see cref="FancyClass{T}"/>

"क्या बात है FancyClass<T>.FancyMethod<K>(T value)?"

   /// <see cref="FancyClass{T}.FancyMethod{K}(T)"/>

"मैं कैसे संदर्भ दे सकता हूं FancyClass<string>?"

   /// <see cref="SomeType.SomeMethod(FancyClass{string})"/>
   /// <see cref="FancyClass{T}"/> whose generic type argument is <see cref="string"/>

जब आप ऐसी विधि का संदर्भ दे सकते हैं जिसके हस्ताक्षर शामिल हैं FancyClass<string>(जैसे एक पैरामीटर प्रकार के रूप में), तो आप ऐसे बंद सामान्य प्रकार को सीधे संदर्भित नहीं कर सकते । दूसरा उदाहरण उस सीमा के आसपास काम करता है। (यह स्थिर System.String.Concat(IEnumerable<string>)विधि के लिए MSDN शोधन पृष्ठ पर उदाहरण के लिए देखा गया है )। :

XML प्रलेखन टिप्पणी crefनियम:

  • {}<>कोण कोष्ठक के बजाय घुंघराले ब्रेसिज़ के साथ सामान्य प्रकार के पैरामीटर सूची को घेरें । यह आपको बाद वाले से बचने से बख्शता है &lt;और &gt;- याद रखें, प्रलेखन टिप्पणियाँ XML हैं!

  • यदि आप एक उपसर्ग शामिल करते हैं (जैसे किT: प्रकार के लिए, M:विधियों के लिए, P:गुणों के लिए, F:खेतों के लिए), तो कंपाइलर संदर्भ का कोई सत्यापन नहीं करेगा, लेकिन crefसीधे डॉक्यूमेंट वैल्यू को डॉक्यूमेंट XML आउटपुट में कॉपी करें । इस कारण से, आपको विशेष "आईडी स्ट्रिंग" सिंटैक्स का उपयोग करना होगा जो ऐसी फ़ाइलों में लागू होता है: हमेशा पूरी तरह से योग्य पहचानकर्ताओं का उपयोग करें, और सामान्य प्रकार के मापदंडों ( `nप्रकारों ``nपर , तरीकों) का संदर्भ करने के लिए बैकटिक्स का उपयोग करें ।

  • आप उपसर्ग छोड़ देते हैं तो , नियमित रूप से भाषा नामकरण नियम लागू होते हैं: यदि आप नामस्थान जिसके लिए वहाँ एक है ड्रॉप कर सकते हैं usingबयान, और आप भाषा के प्रकार के रूप में जैसे कीवर्ड का उपयोग कर सकते intबजाय System.Int32। साथ ही, कंपाइलर शुद्धता के लिए संदर्भ की जांच करेगा।

XML प्रलेखन टिप्पणी crefपत्रक धोखा:

namespace X
{
    using System;

    /// <see cref="I1"/>  (or <see cref="X.I1"/> from outside X)
    /// <see cref="T:X.I1"/>
    interface I1
    {
        /// <see cref="I1.M1(int)"/>  (or <see cref="M1(int)"/> from inside I1)
        /// <see cref="M:X.I1.M1(System.Int32)"/>
        void M1(int p);

        /// <see cref="I1.M2{U}(U)"/>
        /// <see cref="M:X.I1.M2``1(``0)"/>
        void M2<U>(U p);

        /// <see cref="I1.M3(Action{string})"/>
        /// <see cref="M:X.I1.M3(System.Action{System.String})"/>
        void M3(Action<string> p);
    }

    /// <see cref="I2{T}"/>
    /// <see cref="T:X.I2`1"/>
    interface I2<T>
    {
        /// <see cref="I2{T}.M1(int)"/>
        /// <see cref="M:X.I2`1.M1(System.Int32)"/>
        void M1(int p);

        /// <see cref="I2{T}.M2(T)"/>
        /// <see cref="M:X.I2`1.M2(`0)"/>
        void M2(T p);

        /// <see cref="I2{T}.M3{U}(U)"/>
        /// <see cref="M:X.I2`1.M3``1(``0)"/>
        void M3<U>(U p);
    }
}

सिर्फ Tभाग को कैसे देखें ?
नवाफल

4
पता लगा:<typeparamref name="T"/>
nawfal

21

अब तक दिखाए गए उत्तरों में से कोई भी मेरे लिए पूरी तरह से काम नहीं करता है। ReSharper देखने के टैग को Ctrl+ क्लिक-सक्षम लिंक (जैसे) में परिवर्तित नहीं करेगायहाँ छविजब तक यह पूरी तरह से हल नहीं हो जाता है तब तक ) ।

यदि ओपी में विधि नाम की जगह पर होती है Test, तो दिखाए गए तरीके से पूरी तरह से हल की गई लिंक इस प्रकार होगी:

<see cref="M:Test.FancyClass`1.FancyMethod``1(`0)"/>

जैसा कि आप बाहर काम करने में सक्षम हो सकते हैं, वर्ग प्रकार के मापदंडों की संख्या से पहले केवल एक बैकटिक होना चाहिए, फिर विधि प्रकार के मापदंडों की संख्या से पहले दो बैकटिक्स, फिर पैरामीटर उपयुक्त संख्या के बैकटिक्स के साथ शून्य-अनुक्रमित पैरामीटर हैं।

इसलिए हम देख सकते हैं कि FancyClassएक वर्ग प्रकार का पैरामीटर है, FancyMethodएक प्रकार का पैरामीटर है, और FancyClassपैरामीटर प्रकार का एक ऑब्जेक्ट विधि को पारित किया जाएगा।

जैसा कि आप इस उदाहरण में अधिक स्पष्ट रूप से देख सकते हैं:

namespace Test
{
    public class FancyClass<A, B>
    {
        public void FancyMethod<C, D, E>(A a, B b, C c, D d, E e) { }
    }
}

लिंक बन जाता है:

M:Test.FancyClass`2.FancyMethod``3(`0,`1,``0,``1,``2)

या "वर्ग है जो तीन प्रकार पैरामीटर जहां विधि मानकों हैं के साथ एक विधि है दो प्रकार मानकों के साथ ClassType1, ClassType2, MethodType1, MethodType2,MethodType3 "


एक अतिरिक्त नोट के रूप में, मुझे यह कहीं भी प्रलेखित नहीं मिला और मैं जीनियस नहीं हूं, कंपाइलर ने मुझे यह सब बताया। आपको बस एक टेस्ट प्रोजेक्ट बनाना है, XML डॉक्यूमेंटेशन को सक्षम करना है , फिर उस कोड को डालें जिसके लिए आप एक लिंक बनाना चाहते हैं, और उस पर XML डॉक्स टिप्पणी की शुरुआत करें ( ///):

namespace Test
{
    public class FancyClass<T>
    {
        ///
        public string FancyMethod<K>(T value) { return "something fancy"; }
    }

    public class Test
    {
        public static void Main(string[] args) { }
    }
}

फिर अपनी परियोजना का निर्माण करें, और आउटपुट XML दस्तावेज में विशेषता के तहत doc-> members- -> memberतत्व शामिल है name:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Test</name>
    </assembly>
    <members>
        <member name="M:Test.FancyClass`1.FancyMethod``1(`0)">

        </member>
    </members>
</doc>

3
ट्रायल-एंड-एरर से गुजरने के बिना, विशेष रूप से सही नोटेशन को खोजने की चाल के कारण इसे और अधिक अपवोट मिलना चाहिए। कुडोस माई मैन
पीटर

10

लेसे और टीबीसी के जवाबों से आगे:

/// <see cref="T:FancyClass`1{T}"/> for more information.

/// <see cref="M:FancyClass`1{T}.FancyMethod`1{K}(T)"/> for more information.

टूलटिप्स भी सही ढंग से प्रदान करेगा, जबकि उनका संस्करण घुंघराले ब्रेस के साथ इसे प्रस्तुत करता है।


2
<Cref = "System.Collections.Generic.List 1{T}"/>** causes a build-time warning: **XML comment on 'Blah' has syntactically incorrect cref attribute 'System.Collections.Generic.List1 <T> का उपयोग करते हुए - क्या आप इस बात का विस्तार से ध्यान रखेंगे कि इसका उपयोग कैसे करना चाहिए?
Jakub Januszkiewicz

2
हाय जैकब, यह वास्तव में काम नहीं करता है। एक ही तरीका है कि मैं टूलटिप्स को सही ढंग से काम करने के लिए भी देख सकता हूं <cref = "T: <fullTypeName>` 1 {T} "/>।
स्टीफन ड्रू

2
ठीक है, मैं आंशिक रूप से मिल गया। यदि विधि स्वयं जेनेरिक नहीं है (जैसे सूची <T> .Add ()), तो यह काम करता है: <cref = "M: System.Collections.Generic.List`1 {T} .Add (T) / /> देखें। ।
जैकब जानुस्क्विइक्ज़ सिप ub

1
लगता है मेरे लिए काम नहीं कर रहा है। मेरे पास cref = "M: System.Collections.Generic.List`1 {T}" /> टिप्पणी हैडर में जेनेरिक एक्सटेंशन विधि के लिए मैंने लिखा है (एक ArrayList को सूची <T> में परिवर्तित करता है), लेकिन ReSharper इसे झंडे सिंटैक्स त्रुटि के रूप में, और IntelliSense केवल इसे शब्दशः प्रदर्शित करता है। वीएस 2010 / आर # 6.1.37.86
माइक

8
अहा! मैं काम करने में सक्षम था <cref = "T: System.Collections.Generic.List`1" /> " काम करने के लिए। इसलिए, T का उपयोग करके: घुंघराले ब्रेसिज़ के बजाय चाल चली। यह पूर्ण विस्थापन का विस्तार करता है। और ट्रिक काम नहीं करता है यदि आप नाम स्थान को शामिल नहीं करते हैं, तो यह सही नहीं है, लेकिन यह करेगा।
माइक लोक्स

5
/// Here we discuss the use of <typeparamref name="TYourExcellentType"/>.
/// <typeparam name="TYourExcellentType">Your exellent documentation</typeparam>

3
ध्यान दें कि अन्य उत्तर कवर करते हैं कि एक सामान्य वर्ग को कैसे संदर्भित किया जाए, यह उत्तर आपको यह दिखाता है कि किस प्रकार के पैरामीटर को अपने आप से संदर्भित किया जाए, जो कि वह हुआ जो मैं करना चाह रहा था।
jrh

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.