문제

C#.NET 4.0에서 이름과 기본 매개 변수가 어떤 가치가 추가 될 것이라고 생각하십니까?

이것들 (과부하 및 재정의로 아직 달성되지 않은)에 대해 어떻게 사용됩니까?

도움이 되었습니까?

해결책

특히 불변의 유형 (스레딩에 중요 함) - 생성자가 더 간단하게 만들 수 있습니다. 전체 토론은 여기를 참조하십시오. 그것만큼 좋지 않습니다 ~해야 한다 아마도 과부하가 많을 것입니다. 분명히 불변의 객체가있는 객체 초기화기를 사용할 수 없으므로 평소는 다음과 같습니다.

new Foo {Id = 25, Name = "Fred"}

사용할 수 없습니다. 나는 정착 할 것이다 :

new Foo (Id: 25, Name: "Fred")

이것은 과부하를 단순화한다는 일반적인 아이디어로 확장 될 수 있지만 대부분 법적 조합을 광고하는 과부하를 선호합니다. 생성자는 초기 상태를 정의하기 때문에 약간 다릅니다.

사물의 com 측면은 많은 사람들에게도 중요하지만, 나는 단순히 많은 com interop을 사용하지 않습니다. 그래서 이것은 아닙니다. ~처럼 나 한텐 중요해.


RE 의견 편집; 왜 속성이 사용하는 것과 동일한 구문을 사용하지 않았습니까? 단순 - 다른 멤버 / 변수 (속성에 문제가되지 않음)에서 모호 할 수 있습니다. 예를 들어보세요 :

[XmlElement("foo", Namespace = "bar")]

하나의 일반 매개 변수 (CTOR, "FOO")와 이름이 지정된 할당을 사용합니다. 따라서 이것을 정기적으로 명명 된 인수에 사용한다고 가정 해 봅시다.

SomeMethod("foo", SecondArg = "bar");

(또한 생성자 일 수도 있고 단순성을위한 방법을 사용했습니다)

이제 ... 우리가 변수 또는 속성이 있다면 어떨까요? SecondArg? 이것은 사용 사이에 모호합니다 SecondArg 이름이 지정된 인수로 SomeMethod, 그리고 "바"를 할당합니다 SecondArg, "바"를 정기적 인 논증으로 전달.

예를 들어, 이것은 C# 3.0에서 합법적입니다.

    static void SomeMethod(string x, string y) { }
    static void Main()
    {
        string SecondArg;
        SomeMethod("foo", SecondArg = "bar");
    }

분명히, Sec

대체 구문에는 이러한 모호성이 없습니다.


편집 - 280Z28 의이 섹션 : 여기에 추가해서 죄송하지만 실제로는 독특한 답변이 아니며 의견이 너무 길고 코드가 포함되어 있습니다. 당신은 모호성을 암시했지만 예제는 결정적인 사례를 강조하지 않았습니다. 당신이 준 예는 혼란 스러울 수있는 것을 지적하지만 필요하다고 생각합니다. {} 객체 초기화 주변은 기본 구문 모호성을 방지합니다. 다음 코드에 대한 내 설명은 멀티 라인 블록 주석으로 포함됩니다.

[AttributeUsage(AttributeTargets.Class)]
public sealed class SomeAttribute : Attribute
{
    public SomeAttribute() { }

    public SomeAttribute(int SomeVariable)
    {
        this.SomeVariable = SomeVariable;
    }

    public int SomeVariable
    {
        get;
        set;
    }
}

/* Here's the true ambiguity: When you add an attribute, and only in this case
 * there would be no way without a new syntax to use named arguments with attributes.
 * This is a particular problem because attributes are a prime candidate for
 * constructor simplification for immutable data types.
 */

// This calls the constructor with 1 arg
[Some(SomeVariable: 3)]
// This calls the constructor with 0 args, followed by setting a property
[Some(SomeVariable = 3)]
public class SomeClass
{
}

다른 팁

사무실 애플리케이션과 함께 작동하기 위해 괜찮은 API를 제공하는 문제를 피하는 데 도움이됩니다! :)

Office API의 일부는 괜찮지 만 선택적/이름이 지정된 매개 변수가있는 언어로 사용하도록 명확하게 설계된 모서리 케이스가 있습니다. 그래서 C#이 가져야하는 이유입니다.

선택적 매개 변수는 또한 클래스가 수용된 인수에 대한 변형 인 수십 가지 방법을 제공하는 문제를 피합니다.

예외 클래스를 고려하십시오. 옵션 인수가있는 하나의 생성자 대신, '메시지가있는 메시지'의 각 조합에 대해 4 개의 생성자가 있으며 '내부 예외'가 있습니다. 괜찮습니다. 그러나 이제 innerexception을 취하는 생성자에게 널 값을 제공하면 어떻게되는지 고려합니까? innerexception 매개 변수가없는 생성자와 똑같이 작용합니까?

2 개의 옵션 매개 변수를 갖는 단일 생성자는 Null Innerexception을 통과하는 것이 전혀 포함하지 않는 것과 동일하다는 것을 더 명확하게 만들었을 것입니다. 기본 인수를위한 완벽한 장소.

또한 이제 모든 파생 된 예외 클래스에는 4 개의 생성자가 포함되어 있어야합니다. 이는 무의미한 번거 로움입니다.

Com Interop을 훨씬 쉽게 만들 수 있습니다.

C# 4 VB.net이 인터 로프에 훨씬 더 나은 언어가 될 때까지. 기본값이 없으면 C#에 거대한 더미 심판 매개 변수 목록이 있습니다.

코드의 간결성은 떠오르는 분명한 것입니다. 하나의 함수를 정의 할 수있을 때 여러 오버로드를 정의하는 이유. 또한 두 개의 동일하게 입력 된 매개 변수가있는 경우 필요한 전체 오버로드 세트를 구성하는 것이 항상 가능하지는 않습니다.

또한 이것은 컴파일하지 않습니다.

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    public MyAttribute(object a = null)
    {

    }
}


class Test
{
    [My] // [My(a: "asd")]
    int prop1 { get; set; }
}

이것은 다음과 같습니다.

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    public MyAttribute()
    {

    }

    public object a { get; set; }
}

class Test
{
    [My] // [My(a=null)]
    int prop1 { get; set; }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top