VB 단위의 수율.그물
C#에는 수율이라는 키워드가 있습니다.VB.NET에 이 키워드가 없습니다.Visual Basic 프로그래머들은 어떻게 이 키워드가 없는 것을 피할 수 있었습니까?자체 반복기 클래스를 구현합니까?아니면 반복자의 필요성을 피하기 위해 코드를 작성합니까?
yield 키워드는 컴파일러가 백그라운드에서 일부 코딩을 수행하도록 강제합니다.C#에서 반복기의 구현과 그 결과(파트 1)는 그 좋은 예를 가지고 있습니다.
참고: 이 대답은 이제 오래되었습니다.이후 반복기 블록이 VB에 추가되었습니다.NET
C#은 컴파일 시 수율 키워드를 상태 컴퓨터로 변환합니다.VB.NET에는 yield 키워드가 없지만 C#에서 쉽게 사용할 수 없는 함수 내에 상태를 안전하게 포함하기 위한 자체 메커니즘이 있습니다.
C#static
으로 Visual Basic을 됩니다.Shared
키워드, 하지만 두 곳이 헷갈립니다.하나는 C# 정적 클래스가 공유 클래스가 아닌 Visual Basic의 Module이라는 것입니다(Visual Basic에서는 어느 쪽이든 코딩할 수 있지만 nooo는 아닙니다).다른 하나는 VB입니다. NET을 .Static
키워드하지만,Static
VB에서 다른 의미를 가집니다.NET.
다음을 사용합니다.Static
키워드를 입력합니다.NET - 함수 내부의 변수를 선언하며, 사용자가 함수 호출을 수행할 때 변수의 상태를 유지합니다.이는 VB의 정적 함수 멤버이기 때문에 C#에서 전용 정적 클래스 멤버를 선언하는 것과는 다릅니다.컴파일러가 컴파일 시 모니터 클래스를 사용하도록 변환하기 때문에 NET은 스레드 안전성도 보장됩니다.
그런데 왜 여기에 이 모든 것을 적을까요?한 일반적인 것을 수 .Iterator<T>
클래스(또는)Iterator(Of T)
VB.NET(으)로 표시됩니다.에서는 C를 C#으로 합니다.Yield()
그리고.Break()
C# 키워드에 해당하는 메서드입니다.그런 다음 정적 인스턴스(VB)를 사용할 수 있습니다.sense)는으로 C의 C#과 할 수 입니다.yield
거의 동일한 양의 코드(무한히 재사용 가능하므로 클래스 구현 자체 포함).
내가 직접 시도할 만큼 Yield에 대해 충분히 신경 쓰지 않았지만, 할 수 있을 것입니다.그렇긴 하지만, C# 팀 멤버인 Eric Lippert가 이것을 "컴파일러에서 가장 복잡한 변환"이라고 부르는 것처럼 사소한 것도 아닙니다.
또한 1년 이상 전에 이 문서의 초안을 작성한 이후로 Visual Studio 2010이 출시되기 전까지는 의미 있는 방식으로는 불가능하다고 생각하게 되었습니다. 이는 Iterator 클래스에 여러 개의 람다를 보내야 하기 때문에 실제적으로 필요하기 때문입니다.NET 4의 멀티라인 람다 지원
비동기 CTP에는 다음에 대한 지원이 포함되어 있습니다.Yield
VB.NET에서.
사용에 대한 자세한 내용은 Visual Basic의 반복기를 참조하십시오.
이제 Visual Studio 2012에 포함되었습니다!
비주얼 스튜디오 매거진의 빌 매카시가 에뮬레이션에 대해 쓴 VB 나우에서 반복기 사용이라는 멋진 기사가 있습니다.yield
VB.NET에서.또는 Visual Basic의 다음 버전을 기다리십시오.
다행히도 지금 우리는.Yield
돌아가다
다음은 제 프로젝트 + 인터페이스 구현의 예입니다.System.Collections.Generic.IEnumerable(T)
함수:
Public Class Status
Implements IStatus
Private _statusChangeDate As DateTime
Public Property statusChangeDate As DateTime Implements IStatus.statusChangeDate
Get
Return _statusChangeDate
End Get
Set(value As Date)
_statusChangeDate = value
End Set
End Property
Private _statusId As Integer
Public Property statusId As Integer Implements IStatus.statusId
Get
Return _statusId
End Get
Set(value As Integer)
_statusId = value
End Set
End Property
Private _statusName As String
Public Property statusName As String Implements IStatus.statusName
Get
Return _statusName
End Get
Set(value As String)
_statusName = value
End Set
End Property
Public Iterator Function GetEnumerator() As IEnumerable(Of Object) Implements IStatus.GetEnumerator
Yield Convert.ToDateTime(statusChangeDate)
Yield Convert.ToInt32(statusId)
Yield statusName.ToString()
End Function
End Class
Public Interface IStatus
Property statusChangeDate As DateTime
Property statusId As Integer
Property statusName As String
Function GetEnumerator() As System.Collections.Generic.IEnumerable(Of Object)
End Interface
외부에서 모든 속성을 추출하는 방법은 다음과 같습니다.
For Each itm As SLA.IStatus In outputlist
For Each it As Object In itm.GetEnumerator()
Debug.Write(it & " ")
Next
Debug.WriteLine("")
Next
VB.NET에는 다음과 같은 기능이 있습니다.Iterator
키워드 https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/modifiers/iterator
Visual Studio 2012 이후로
저는 개인적으로 다음을 계승하는 저만의 반복기 클래스를 작성합니다.IEnumerator(Of T)
제대로 하려면 시간이 좀 걸리긴 하지만, 결국에는 제대로 쓰고 피하려고 노력하는 것이 좋을 것 같습니다.내가 한 또 다른 방법은 반환하는 재귀적인 방법을 쓰는 것입니다.IEnumerable(Of T)
그리고 방금 돌아왔습니다.List(Of T)
및 용도.AddRange
.
바라건대, 이것이 다가오는 VB 버전에서는 과거의 일이 되기를 바랍니다.반복자들은 실제로 새로운 패러다임(특히 LINQ와 게으른 평가의 조합)으로 많은 중요성을 얻고 있기 때문에, 제가 Paul Vick의 블로그에서 알고 있는 한, 이것은 꽤 높은 우선순위를 가지고 있습니다.한편, Paul은 더 이상 VB 팀의 책임자가 아니며 저는 아직 PCD 회담을 볼 시간이 없었습니다.
그래도 관심이 있으시다면 폴의 블로그에 링크되어 있습니다.
아래 코드는 출력을 제공합니다.
2, 4, 8, 16, 32
VB.NET에서.
Public Shared Function setofNumbers() As Integer()
Dim counter As Integer = 0
Dim results As New List(Of Integer)
Dim result As Integer = 1
While counter < 5
result = result * 2
results.Add(result)
counter += 1
End While
Return results.ToArray()
End Function
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For Each i As Integer In setofNumbers()
MessageBox.Show(i)
Next
End Sub
C#에서
private void Form1_Load(object sender, EventArgs e)
{
foreach (int i in setofNumbers())
{
MessageBox.Show(i.ToString());
}
}
public static IEnumerable<int> setofNumbers()
{
int counter=0;
int result=1;
while (counter < 5)
{
result = result * 2;
counter += 1;
yield return result;
}
}
언급URL : https://stackoverflow.com/questions/97381/yield-in-vb-net
'programing' 카테고리의 다른 글
변수 워크북 / 워크시트 vba 선언 (0) | 2023.05.19 |
---|---|
HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까?(헤드 분리) & 커밋 실행 취소 (0) | 2023.05.14 |
윈도우즈 EXE 파일 서명 (0) | 2023.05.14 |
Pip은 Ubuntu의 Python 3.10에서 작동하지 않습니다. (0) | 2023.05.14 |
iPhone 시뮬레이터 정리 (0) | 2023.05.14 |