簡體   English   中英

.NET不安全的字符串操作

[英].NET Unsafe string manipulation

我使用下一個不安全的代碼進行字符串修改:

public static unsafe void RemoveLastOne(ref string Str1)
    {
        if (Str1.Length < 1)
            return;

        int len = Str1.Length - 1;
        fixed (char* pCh1 = Str1)
        {
            int* pChi1 = (int*)pCh1;
            pCh1[len] = '\0';
            pChi1[-1] = len;
        }
    }

但是一段時間后我的C#programm崩潰了,例外:

FatalExecutionEngineError:“運行時遇到致命錯誤。錯誤地址為0x6e9a80d9,在線程0xcfc上。錯誤代碼為0xc0000005。此錯誤可能是CLR中的錯誤或用戶的不安全或不可驗證部分此錯誤的常見來源包括COM-interop或PInvoke的用戶封送錯誤,這可能會破壞堆棧。“

如果我將函數“RemoveLastOne”更改為“Str1 = Str1.Remove(Str1.Length - 1);” 程序工作正常。

為什么發生異常? 我如何正確地在C#中實現不安全的更改字符串?

.Net中的String值旨在是不可變的。 在這個函數中,您將獲取一個不可變的值,以幾種可見的方式(內容和長度)對其進行變更,更不用說在原始數據之前寫入數據了。 我並不感到驚訝,這會導致后來的CLR崩潰,因為它的特殊情況在幾個地方的String值並在指針之前寫入是危險的。

我真的不明白為什么你想在這里做不安全的操作。 安全代碼是直截了當的,不會導致這些類型的難以追蹤錯誤。

不安全的字符串操作本質上是不正確的。 .NET字符串不應該被編輯,並且很可能框架中的代碼是圍繞字符串永遠不會改變的假設構建的。 任何依賴於String.GetHashCode()的東西都會立即出現,但可能會有幕后優化或完整性檢查。 據推測它就是導致CLR錯誤的東西。

如果您在分析后發現.NET的不可變字符串實現不符合您的需求,那么允許您修改其長度的最簡單的可變替代方法是List<char>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM