J'aimerais connaître l'équivalent VB.NET du code C # suivant:
unsafe { byte* pStart = (byte*)(void*)writeableBitmap.BackBuffer; int nL = writeableBitmap.BackBufferStride; for (int r = 0; r < 16; r++) { for (int g = 0; g < 16; g++) { for (int b = 0; b < 16; b++) { int nX = (g % 4) * 16 + b; int nY = r*4 + (int)(g/4); *(pStart + nY*nL + nX*3 + 0) = (byte)(b * 17); *(pStart + nY*nL + nX*3 + 1) = (byte)(g * 17); *(pStart + nY*nL + nX*3 + 2) = (byte)(r * 17); } } } }
4 Réponses :
On dirait que ce n'est pas possible. P>
de Cet article p>
vb.net est plus restrictif que c # dans cet égard. Cela ne permet pas la utilisation de code dangereux sous n'importe quel circonstances. P> blockQuote>
non possible, car vb.net ne prend pas en charge le code dangereux. em> fort> p> p>
Vous ne devriez pas répondre à votre propre question en copiant la réponse de quelqu'un d'autre. Acceptez simplement la réponse de Bala R à la place.
vb.net n'autorise pas l'utilisation de code dangereux, mais vous pouvez faire votre code dans Safe Géré:
Dim pStart As IntPtr = AddressOf (writeableBitmap.BackBuffer()) Dim nL As Integer = writeableBitmap.BackBufferStride For r As Integer = 0 To 15 For g As Integer = 0 To 15 For b As Integer = 0 To 15 Dim nX As Integer = (g Mod 4) * 16 + b Dim nY As Integer = r * 4 + CInt(g \ 4) Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 0),(b * 17)) Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 1),(g * 17)) Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 2),(r * 17)) Next Next Next
Ce n'est pas pareil. Le code dangereux permet d'utiliser des pointeurs, ce code géré utilise des références. Les références sont nettement plus lentes que les pointeurs.
Qui se soucie d'environ 0,00001sec et 0.00002Sec?
Utiliser des pointeurs n'est pas seulement la moitié du temps d'utiliser des références.
Salut Bro, ton œil ne voit rien quand il exécute le code. Pourquoi tu te sens toujours déranger?
C'est comme dire qu'un tri de bulles est identique à un tri rapide simplement parce que votre œil ne peut voir aucune différence avec un petit ensemble d'articles.
Je ne veux pas perdre mon temps à cette conversation mon ami. Comme je l'ai dit 0.00001 et 0.00002 n'est rien pour mettre fin à l'utilisateur. Même 1Sec à 2sec est toujours acceptable.
Ce n'est pas une grande conversation. Les références sont nettement plus lentes que les pointeurs. La question était de savoir comment utiliser un code dangereux dans VB.NET et votre réponse de réponse consiste à utiliser le code géré. Le code géré est très différent du code dangereux et est beaucoup plus lent que "juste" doubler le temps. Je ne sais pas pourquoi vous refusez d'accepter le fait. Vous pouvez nier tout ce que vous aimez mais qui ne changera pas la réalité. Et vos commentaires indiquent que vous n'avez aucune expérience de tout logiciel évolutif qui doit bien performer sous charge.
Vb.net n'autorise pas le code dangereux et le code VB.NET géré dans votre réponse n'est pas le même que le code dangereux en C #. Période. Je ne sais pas pourquoi tu vas encore à ce sujet.
Virez-vous également à moi-même indiquer - votre code ne compile pas. Vous ne pouvez pas utiliser adresse de code> sur un objet comme celui-ci;
adresse de code> fonctionne uniquement avec le nom d'une méthode.
Changez les limites de vos boucles à quelque chose de beaucoup plus grand et vous remarquerez une différence. Cette réponse est des ordures.
Vous pouvez utiliser ce code de sécurité avec le même résultat
Dim pStart As Pointer(Of Byte) = CType(CType(writeableBitmap.BackBuffer, Pointer(Of System.Void)), Pointer(Of Byte)) Dim nL As Integer = writeableBitmap.BackBufferStride For r As Integer = 0 To 15 For g As Integer = 0 To 15 For b As Integer = 0 To 15 Dim nX As Integer = (g Mod 4) * 16 + b Dim nY As Integer = r * 4 + CInt(g \ 4) (pStart + nY * nL + nX * 3 + 0).Target = CByte(b * 17) (pStart + nY * nL + nX * 3 + 1).Target = CByte(g * 17) (pStart + nY * nL + nX * 3 + 2).Target = CByte(r * 17) Next Next Next
Est pointeur code> le
system.reflection.pointer code> classe? C'est le seul que je puisse trouver, mais cela n'a pas l'air bien (cela nécessite d'utiliser des méthodes statiques .Box et .Unbox pour protéger / dégrotter la mémoire dangereuse) ...
Vous pouvez le mettre dans un assembly C # et le référer à partir de votre projet VB.NET.
Voir aussi Stackoverflow.com/Questtions/2307433/... .