PDA

View Full Version : سوال: ساخت متدی شبیه mid !



Samsam2010
چهارشنبه 23 آذر 1390, 17:19 عصر
با سلام

یک متد در وی بی هست به اسم mid که یک قسمت از رشته رو برمی گردونه !
حالا شاید بگید که چرا تابع رو میخوای بنویسی وقتی وجود داره ! اما بهش برای یک کار دیگه احتیاج دارم !

حالا من میخوام یک متد بنویسم که خود تابع mid باشه ! نه از اون استفاده کنه !

توابع سطح پایین وجود داره !؟ اون توابع چیه ؟

خود تابع mid چطوری کار میکنه ! ؟ (به لحاظ فنی !)

دوستان ایده های خودتون رو بگید ممنون میشم !

Mani_rf
چهارشنبه 23 آذر 1390, 22:58 عصر
برات با Reflector بازش کردم توش این کد ها نوشته شده بود :
Public Shared Function Mid(ByVal str As String, ByVal Start As Integer, ByVal Length As Integer) As String
If (Start <= 0) Then
Throw New ArgumentException(Utils.GetResourceString("Argument_GTZero1", New String() { "Start" }))
End If
If (Length < 0) Then
Throw New ArgumentException(Utils.GetResourceString("Argument_GEZero1", New String() { "Length" }))
End If
If ((Length = 0) OrElse (str Is Nothing)) Then
Return ""
End If
Dim length As Integer = str.Length
If (Start > length) Then
Return ""
End If
If ((Start + Length) > length) Then
Return str.Substring((Start - 1))
End If
Return str.Substring((Start - 1), Length)
End Function



متاسفه نه کلاس String که این تابع درونش قرار داره از نوع NotInheritable تعریف شده که نمی تونی ازش ارث ببری و تغییرش بدی.

Mani_rf
چهارشنبه 23 آذر 1390, 23:05 عصر
البته اون خودش از Sub String استفاده میکنه اون هم از یکی دیگه و همینطوری به ترتیب به این شکل :

<SecuritySafeCritical, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")> _
Public Function Substring(ByVal startIndex As Integer, ByVal length As Integer) As String
Return Me.InternalSubStringWithChecks(startIndex, length, False)
End Function



<SecurityCritical> _
Friend Function InternalSubStringWithChecks(ByVal startIndex As Integer, ByVal length As Integer, ByVal fAlwaysCopy As Boolean) As String
If (startIndex < 0) Then
Throw New ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_StartIndex"))
End If
If (startIndex > Me.Length) Then
Throw New ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_StartIndexLargerThanLength"))
End If
If (length < 0) Then
Throw New ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_NegativeLength"))
End If
If (startIndex > (Me.Length - length)) Then
Throw New ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_IndexLength"))
End If
If (length = 0) Then
Return String.Empty
End If
Return Me.InternalSubString(startIndex, length, fAlwaysCopy)
End Function



<SecurityCritical> _
Private Function InternalSubString(ByVal startIndex As Integer, ByVal length As Integer, ByVal fAlwaysCopy As Boolean) As String
If (((startIndex = 0) AndAlso (length = Me.Length)) AndAlso Not fAlwaysCopy) Then
Return Me
End If
Dim str As String = String.FastAllocateString(length)
Dim chRef As Char*
Fixed chRef = AddressOf str.m_firstChar
Dim chRef2 As Char*
Fixed chRef2 = AddressOf Me.m_firstChar
String.wstrcpy(chRef, (chRef2 + startIndex), length)
End Fixed
End Fixed
Return str
End Function



<SecurityCritical> _
Friend Shared Sub wstrcpy(ByRef dmem As Char, ByRef smem As Char, ByVal charCount As Integer)
If (charCount > 0) Then
If ((CInt(dmem) And 2) <> 0) Then
dmem(0) = smem(0)
dmem += 1
smem += 1
charCount -= 1
End If
Do While (charCount >= 8)
DirectCast(dmem, Integer*) = DirectCast(smem, UInt32*)
DirectCast((dmem + 2), Integer*) = DirectCast((smem + 2), UInt32*)
DirectCast((dmem + 4), Integer*) = DirectCast((smem + 4), UInt32*)
DirectCast((dmem + 6), Integer*) = DirectCast((smem + 6), UInt32*)
dmem = (dmem + 8)
smem = (smem + 8)
charCount = (charCount - 8)
Loop
If ((charCount And 4) <> 0) Then
DirectCast(dmem, Integer*) = DirectCast(smem, UInt32*)
DirectCast((dmem + 2), Integer*) = DirectCast((smem + 2), UInt32*)
dmem = (dmem + 4)
smem = (smem + 4)
End If
If ((charCount And 2) <> 0) Then
DirectCast(dmem, Integer*) = DirectCast(smem, UInt32*)
dmem = (dmem + 2)
smem = (smem + 2)
End If
If ((charCount And 1) <> 0) Then
dmem(0) = smem(0)
End If
End If
End Sub



این هم انتهاش.
امیدوارم کمکت کنه

Mani_rf
چهارشنبه 23 آذر 1390, 23:10 عصر
کاره دیگه هم که میتونی بکنی اینه که رشته را با یک حلقه پیمایش کنی و قسمتی که لازم داری را جداکنی. خیلی سخت نیست با استفاده از ایندکس کاراکتر