2013-05-16 8 views
11

this के अनुसार एक स्ट्रिंग (या स्ट्रिंग) एक संदर्भ प्रकार है।टाइपिंग के लिए Type.IsByRef क्यों स्ट्रिंग वापसी झूठी है यदि स्ट्रिंग एक संदर्भ प्रकार है?

अभी तक नहीं दिया गया:

Type t = typeof(string); 

तो

if (t.IsByRef) ...  

रिटर्न झूठी

क्यों?

संपादित करें: कुछ त्वरित परीक्षण के बाद, मैं स्पष्ट रूप से IsByRef के उद्देश्य को गलत समझ रहा हूं ... 'स्ट्रिंग' के स्थान पर कक्षा नाम का उपयोग करने के साथ-साथ झूठी वापसी भी करता है। मैं एक सामान्य वर्ग लिख रहा हूं और परीक्षण करना चाहता हूं कि जेनेरिक तत्काल होने पर टाइप किए जाने वाले प्रकार एक मान या संदर्भ प्रकार हैं। इसके लिए एक परीक्षण कैसे करता है?

+1

शब्द ** 'द्वारा' ** सजावट के लिए नहीं है, इसका अर्थ है। ;) – Mehrdad

+0

@ मेहरदाद - अच्छी तरह से कहा - अब मुझे यह उद्देश्य पता है IsByRef! – PMBottas

उत्तर

9

आप IsValueType बजाय का उपयोग करना चाहिए:

bool f = !typeof (string).IsValueType; //return true; 

IsByRef का सवाल है, इस संपत्ति का उद्देश्य है निर्धारित करने के लिए पैरामीटर रेफरी द्वारा या मूल्य से विधि में पारित कर दिया गया है या नहीं।

public static void Foo(ref int a) 
{ 
} 

आप निर्धारित कर सकते हैं कि क्या a है संदर्भ या नहीं द्वारा पारित:

उदाहरण आप एक तरीका है जिसके a रेफरी द्वारा पारित किया गया है

bool f = typeof (Program).GetMethod("Foo") 
           .GetParameters() 
           .First() 
           .ParameterType 
           .IsByRef; //return true 
+0

अहह! मार्बलहेड पर हल्की सुबह! धन्यवाद! – PMBottas

5

आप यह देखना चाहते हैं कि यह value type है या नहीं।

typeof(object).IsValueType :- false 
typeof(int).IsValueType :- true 
+0

@ हाबीब अच्छी तरह से देखा गया! –

9

वहाँ "संदर्भ प्रकार" कर रहे हैं - जिसके लिए हमारे पास !type.IsValueType है - और फिर ऐसे प्रकार हैं जो संदर्भों का प्रतिनिधित्व करते हैं से कुछ भी - चाहे उनके लक्ष्य हैं मूल्य प्रकार या संदर्भ प्रकार।

जब आप कहते हैं कि void Foo(ref int x), x "संदर्भ द्वारा पारित कर दिया" किया जाना है, इसलिए ByRef कहा जाता है।
हुड के अंतर्गत, x एक प्रकार ref int, जो typeof(int).MakeReferenceType() के अनुरूप होगा की संदर्भ है।

ध्यान दें कि ये दो अलग-अलग प्रकार के "संदर्भ" हैं, जो एक दूसरे के लिए पूरी तरह से ऑर्थोगोनल हैं।

(वास्तव में, वहाँ "संदर्भ" का एक तिहाई तरह, System.TypedReference है, जो सिर्फ एक struct है
वहाँ भी संदर्भ का एक चौथे प्रकार, प्रकार है कि हर सी प्रोग्रामर जानता है -।। सूचक, T*)

+3

IsByRef भी एक वीबी पृष्ठभूमि के साथ बहुत अधिक समझ में आता है, जहां एक ही विधि हस्ताक्षर होगा: उप फू (ByRef x इंटीजर के रूप में) – Jimmy

+0

सभी उत्तरदाताओं के लिए धन्यवाद! जैसे मैंने कहा, "आईएसबीरफ के उद्देश्य की स्पष्ट रूप से गलतफहमी" ... और यह सोचने के लिए कि मैं मूल रूप से उपयोग कर रहा था IsValueType लेकिन आईएसबीरफ में बदल गया क्योंकि मैं 'नल-नेस' सोचने के लिए परीक्षण करना चाहता था। आईएसबीरफ IsValueType के विपरीत (यदि यह था, तो यह होगा IsRefType d'ओह!) – PMBottas

संबंधित मुद्दे