programing

VB.NET의 기본 속성?

i4 2023. 5. 21. 10:58
반응형

VB.NET의 기본 속성?

.NET 초기에는 기본 속성을 지정하기 위해 클래스를 장식할 수 있는 속성이 있었다고 생각합니다.

제가 찾은 몇몇 기사들에 따르면, 이것은 어느 시점에서 틀에서 끌어낸 것으로 보이는데, 왜냐하면 그것이 약간 혼란스러웠기 때문이고, 저는 그것이 어떻게 사실인지 알 수 있습니다.

그럼에도 불구하고 제공된 기능을 얻을 수 있는 다른 방법이 있습니까?

이것은 다음과 같이 보였습니다.

<DefaultProperty("Value")> _  
Public Class GenericStat
    ...
    Public Property Value() As Integer
        ...
    End Property
    ...
End Class

이것은 당신이 할 수 있게 해주었습니다.Response.Write(MyObject)Response.Write(MyObject.Value)이것은 매우 투박한 예는 아니지만, 몇몇 복잡한 객체 지향적인 상황에서는 약간 끔찍해집니다.더 좋은 방법이 있다면 알려주시기 바랍니다.

참고: 매개 변수를 사용하는 속성에만 사용할 수 있는 기본 키워드를 찾고 있지 않습니다.

.NET 프레임워크에는 기본 멤버에 대한 개념이 있습니다.주요 구성 요소는 DefaultMemberAttribute 클래스 및 Type입니다.GetDefaultMembers().VB.NET에서는 기본 멤버를 지정하는 것이 언어 구문의 일부입니다.

  Public Class Sample
    Private mValue As Integer
    Default Public ReadOnly Property Test(ByVal index As Integer) As Integer
      Get
        Return index
      End Get
    End Property
  End Class

다음과 같이 사용합니다.

  Sub Main()
    Dim s As New Sample
    Console.WriteLine(s(42))
    Console.ReadLine()
  End Sub

컴파일러는 [DefaultMember]을(를) 자동으로 실행하여 이를 구현합니다.그러나 이것에는 제한이 있습니다. 특히 구문 모호성을 방지하려면 속성에 인덱스 인수가 있어야 합니다.속성을 명시적으로 지정할 때는 이 제한이 적용되지 않습니다.

  <System.Reflection.DefaultMember("AnotherTest")> _
  Public Class Sample
    Public ReadOnly Property AnotherTest() As Integer
      Get
        Return 42
      End Get
    End Property
  End Class

그러나 해당 기본 멤버는 이러한 구문을 허용하는 언어에서만 기본값으로 액세스할 수 있습니다..NET의 예를 잘 모르지만, 이것은 VB6와 같이 COM 시절에 사용되었습니다.또한 VB6에 Set 키워드가 있는 핵심 이유는 모호성을 해결하고 "나는 객체의 기본 속성이 아닌 객체를 의미한다"고 명시합니다.그 당시 Visual Basic을 시작하는 많은 프로그래머들에게 매우 고통스러운 구문 세부사항이었습니다.

C#은 규칙이 완전히 동일하지만 같은 종류의 유연성을 허용하지 않습니다.인덱서를 이전에 본 적이 있을 것입니다.

  public class Sample {
    public int this[int index] {
      get { return index; }
    }
  }

또한 이 코드는 컴파일러가 [DefaultMember] 특성을 출력하도록 합니다.해당 특성의 명명된 속성은 "Item"입니다.이러한 이유로 MSDN 라이브러리에 문서화되고 색인화된 인덱서가 "항목"으로 표시됩니다.

저는 당신이 원래 포스터가 원하는 것을 정확히 할 수 있다는 것을 발견했습니다.Widening Operator CType위에서 언급한 내용이지만 자세히 설명하지 않아 이 질문에 대한 답을 찾으려다 완전히 놓쳤습니다.이 방법론은 기본 속성 자체를 정의하지는 않지만 동일한 결과를 얻습니다.

Public Class GenericStat
    ...
    Public Property Value() As Integer
    ...
    End Property
    ...
    'this could be overloaded if needed
    Public Sub New(ByVal Value As Integer)
        _Value = Value
    End Sub
    '
    Public Shared Widening Operator CType(ByVal val As Integer) As GenericStat
        Return New GenericStat(val)
    End Operator
    '
    Public Shared Widening Operator CType(ByVal val As GenericStat) As Integer
        Return val.Value
    End Operator
End Class

그래서 지금

Dim MyObject as GenericStat
MyObject = 123

그리고.

Dim Int as Integer
Int = MyObject   

작품 모두 없이..Value및 "" " "와 같은 인덱서 "myobject(1)

이 예제에서는 개체를 풀지만 정수로 변환하지는 않습니다.

는 왜 수 지Widening Operator CType당신이 우리에게 보여준 코드는 작업할 수 있습니다.그러나 암묵적인 변환은 주의해야 합니다.그것들은 일반적으로 좋은 생각이 아닙니다.

아니요, VB 7에서 명시적으로 제거되었습니다.

기본 속성의 긴 체인이 있는 경우 반환될 항목을 정확히 아는 것은 어렵습니다. 다일 때. 일때 둘 다일 때.b그리고.c다가 나다Foo 방법까, 니습맞?입니까?a.Foo(1)의미하다a.b.Foo(1)또는a.b.c.Foo(1)?

진짜 키커는.Set기본 속성을 삭제함으로써, 그들은 또한 삭제할 수 있었습니다.Set개체 할당에 대한 키워드입니다.

저는 비슷한 문제에 대한 답을 찾고 있었고, 그 과정에서 우연히 이 문제를 발견했습니다.사실 존의 대답은 내가 가야 할 방향을 가리켰습니다.또한 원래 질문에도 도움이 될 수 있습니다.

내 문제:정수처럼 사용할 수 있는 것이 필요했습니다.

Dim myVal as Integer
myVal = 15
If myVal = 15 then
  ...
End If

... 등등...하지만 나는 추가적인 것들도 필요했습니다.

myVal.SomeReadOnlyProperty (as String)
myVal.SomeOtherReadOnlyProperty (as Integer)

읽기 될 수 있습니다 (실사읽전속메소될도수다있니습드은성용기)...▁(
나는 그래서 나는 정말 물체가 필요했습니다.

Integer ( @ _ @ ) ...에 대한 확장 방법을 생각하고 있었습니다.저는 그 길로 가고 싶지 않았습니다...

나는 또한 "ReadOnlyPropertyOracle"을 별도의 클래스로 작성하고 그것에 주는 방법을 생각했습니다.

GetSomeReadOnlyProperty(ByVal pVal as Integer) as String
GetSomeOtherReadOnlyProperty(ByVal pVal as Integer) as Integer

안녕...효과가 있었겠지만 소름끼치게 보였어요...

그래서 John's Hack과 Brian MacKay가 연산자에 대해 언급했습니다. 확장/축소 변환 연산자(할당용)와 비교 연산자를 모두 결합하여 ...잘 비교했습니다.다음은 제 코드의 일부이며 필요한 작업을 수행합니다.

'The first two give me the assignment operator like John suggested
Public Shared Widening Operator CType(ByVal val As Integer) As MySpecialIntType
    Return New MySpecialIntType(val)
End Operator

'As opposed to John's suggestion I think this should be Narrowing?
Public Shared Narrowing Operator CType(ByVal val As MySpecialIntType) As Integer
    Return val.Value
End Operator

'These two give me the comparison operator
'other operators can be added as needed
Public Shared Operator =(ByVal pSpecialTypeParameter As MySpecialIntType, ByVal pInt As Integer) As Boolean
    Return pSpecialTypeParameter.Value = pInt
End Operator

Public Shared Operator <>(ByVal pSpecialTypeParameter As MySpecialIntType, ByVal pInt As Integer) As Boolean
    Return pSpecialTypeParameter.Value <> pInt
End Operator

네, 이것은 여전히 1-24개의 한 줄 연산자 정의가 될 것입니다. 하지만 대부분은 사소한 것들로 오류의 여지가 거의 없습니다;-) 그래서 이것은 저에게 효과가 있습니다.

속성이 있으므로 예제가 정확해야 하지만 이는 Windows Forms desinger에서 사용되는 구성 요소에 대한 것으로 보입니다.

응답을 수행할 때 값을 문자열로 출력하도록 ToString 메서드를 재정의할 수 있습니다.쓰기(MyObject), 동일한 효과를 얻을 수 있습니다.

    Public Overrides Function ToString() As String
        Return Me.Value.ToString 
    End Function

[편집] 이제 더 잘 이해했으므로, 포함된 개체의 값을 직접 확인할 수 있는 방법을 제공하는 것이 어떻습니까?

Public Class MyClass
    Private m_Stats(100) As Stats  ' or some other collection'

    Public Property StatValue(ByVal stat_number As Integer) As _
        Integer
        Get
            Return m_Stats(stat_number)
        End Get
        Set(ByVal Value As Integer)
            m_Stats(stat_number) = Value
        End Set
    End Property
End Class

저의 질문에 답하자면, 운영자 오버로딩은 여기서 흥미로운 해결책인 것 같습니다.

결국, 그것은 잘 맞지 않았습니다.

저는 결국 171줄 정도의 방법을 추가해야 했고, 이것은 버그를 위한 많은 공간을 의미했습니다.더 중요한 것은 할당 연산자에 과부하를 걸 수 없다는 것입니다.=동일성 테스트 전용입니다.

그래서 이것에도 불구하고, 저는 다음과 같이 말할 수 없습니다.

Dim x as Integer = MyObject.Stats(Stat.Health)...이 예제에서는 개체를 끌어 당긴 하지만 정수로 변환하지 않으므로 결과는 당연히 예외입니다.

제가 정말로 필요한 것은 구식의 좋은 기본 부동산이지만, 저는 그 시대는 끝났다고 생각합니다.

안녕 존 당신의 대답은 매우 유용했습니다!어떤 타입이든 사용할 수 있도록 변경했습니다, 감사합니다.

Public Class GenericStat(Of Ttype)

Public Property Value As Ttype
'
Public Sub New()

End Sub
'
'this could be overloaded if needed
Public Sub New(ByVal Value As Ttype)
   _Value = Value
End Sub
'
Public Shared Widening Operator CType(ByVal val As Ttype) As GenericStat(Of Ttype)
   Return New GenericStat(Of Ttype)(val)
End Operator
'
Public Shared Widening Operator CType(ByVal val As GenericStat(Of Ttype)) As Ttype
   Return val.Value
End Operator

End Class

사용법:

Dim MyInteger As GenericStat(Of Integer)
MyInteger = 123

Dim Int As Integer
Int = MyInteger

Dim MyString As GenericStat(Of String)
MyString = "MyValue"

Dim Str As String
Str = MyString

시스템을 가져오는 경우에도 속성을 사용할 수 있습니다.구성요소 모델.

다른 사람들이 언급했듯이, 이것은 VB 이후로 이상적이지 않습니다.기본 속성을 사용하는 것이 좋습니다.물론 조건이 수반되지만 실제로 도움이 되지는 않습니다(예: 색인 필요).

하지만 만약 당신이

Imports System.ComponentModel

클래스에서 속성을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/293215/default-properties-in-vb-net

반응형