इस समस्या का सबसे अच्छा समाधान क्या है? मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जिसमें कक्षा प्रकारों के कई वैकल्पिक पैरामीटर हैं जिनके लिए शून्य एक सार्थक मान है और इसे डिफ़ॉल्ट के रूप में उपयोग नहीं किया जा सकता है। , के रूप मेंसी # वैकल्पिक पैरामीटर कक्षा पैरामीटर के लिए शून्य के अलावा?
public void DoSomething(Class1 optional1, Class2 optional2, Class3 optional3) { if (! WasSpecified(optional1)) { optional1 = defaultForOptional1; } if (! WasSpecified(optional2)) { optional2 = defaultForOptional2; } if (! WasSpecified(optional3)) { optional3 = defaultForOptional3; } // ... do the actual work ... }
मैं Class1 optional1 = null
उपयोग नहीं कर सकते क्योंकि अशक्त सार्थक है।
- हर संभव संयोजन है, जिसके लिए 8 भार के का मतलब है के साथ भार के प्रदान करें: मैं क्योंकि इन वैकल्पिक पैरामीटर मैं इन विकल्पों के साथ आए हैं के लिए संकलन समय निरंतर आवश्यकता के कुछ प्लेसहोल्डर वर्ग उदाहरण
Class1 optional1 = defaultForOptional1
उपयोग नहीं कर सकते यह विधि। - प्रत्येक वैकल्पिक पैरामीटर के लिए एक बूलियन पैरामीटर शामिल करें जो दर्शाता है कि डिफ़ॉल्ट का उपयोग करना है या नहीं, जिसे मैं हस्ताक्षर को अपनाना चाहता हूं।
क्या कोई इस के लिए कुछ चालाक समाधान के साथ आया है?
धन्यवाद!
संपादित करें: मैंने एक रैपर वर्ग लिखना समाप्त कर दिया, इसलिए मुझे Boolean HasFoo
दोहराना नहीं पड़ा।
/// <summary>
/// A wrapper for variables indicating whether or not the variable has
/// been set.
/// </summary>
/// <typeparam name="T"></typeparam>
public struct Setable<T>
{
// According to http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx,
// "[s]tructs cannot contain explicit parameterless constructors" and "[s]truct
// members are automatically initialized to their default values." That's fine,
// since Boolean defaults to false and usually T will be nullable.
/// <summary>
/// Whether or not the variable was set.
/// </summary>
public Boolean IsSet { get; private set; }
/// <summary>
/// The variable value.
/// </summary>
public T Value { get; private set; }
/// <summary>
/// Converts from Setable to T.
/// </summary>
/// <param name="p_setable"></param>
/// <returns></returns>
public static implicit operator T(Setable<T> p_setable)
{
return p_setable.Value;
}
/// <summary>
/// Converts from T to Setable.
/// </summary>
/// <param name="p_tee"></param>
/// <returns></returns>
public static implicit operator Setable<T>(T p_tee)
{
return new Setable<T>
{
IsSet = true
, Value = p_tee
};
}
}
अधिभार आपको शाब्दिक शून्य निरंतर पारित करने नहीं देगा। (बस एक शैली मुद्दा।) – Neil
आप यहां पूरा करने का प्रयास कर रहे हैं? –