체계적인 방법이 틀림없이 가장 좋은 것일까?

15008 단어 메서드

인용문


오늘 또 어떤 사람이 이 종류(이 방법) 시스템이 모두 있으니 직접 시스템으로 쓰면 된다고 말하는 것을 들었다. 설마 네가 쓴 것이 시스템보다 낫겠니?
나는 의문이 생겼다. 같은 사람이 쓴 코드인데 왜 시스템이 틀림없이 가장 좋은가?

쓸데없는 말은 많지 않으니, 직접 코드를 붙여라.

string.IsNullOrWhiteSpace(string value)

이 방법은 다들 잘 알고 계실 거라고 믿습니다.
그런데 어느 날 리플렉터를 켜서 원본을 봤을 때 깜짝 놀랐어요...
//string 

public static bool IsNullOrWhiteSpace(string value)
{
    if (value != null)
    {
        for (int i = 0; i < value.Length; i++)
        {
            if (!char.IsWhiteSpace(value[i]))
            {
                return false;
            }
        }
    }
    return true;
}


//char 

public static bool IsWhiteSpace(char c)
{
    if (IsLatin1(c))
    {
        return IsWhiteSpaceLatin1(c);
    }
    return CharUnicodeInfo.IsWhiteSpace(c);
}


private static bool IsLatin1(char ch)
{
    return (ch <= '\x00ff');
}

 

private static bool IsWhiteSpaceLatin1(char c)
{
    if (((c != ' ') && ((c < '\t') || (c > '\r'))) && ((c != '\x00a0') && (c != '\x0085')))
    {
        return false;
    }
    return true;
}

//CharUnicodeInfo 

internal static bool IsWhiteSpace(char c)
{
    switch (GetUnicodeCategory(c))
    {
        case UnicodeCategory.SpaceSeparator:
        case UnicodeCategory.LineSeparator:
        case UnicodeCategory.ParagraphSeparator:
            return true;
    }
    return false;
}


public static UnicodeCategory GetUnicodeCategory(char ch)
{
    return InternalGetUnicodeCategory(ch);
}


internal static UnicodeCategory InternalGetUnicodeCategory(int ch)
{
    return (UnicodeCategory) InternalGetCategoryValue(ch, 0);
}


internal static unsafe byte InternalGetCategoryValue(int ch, int offset)
{
    ushort num = s_pCategoryLevel1Index[ch >> 8];
    num = s_pCategoryLevel1Index[num + ((ch >> 4) & 15)];
    byte* numPtr = (byte*) (s_pCategoryLevel1Index + num);
    byte num2 = numPtr[ch & 15];
    return s_pCategoriesValue[(num2 * 2) + offset];
}

모두 8개의 관련 방법이 있는데, 사용한 필드는 깊이 연구하지 않았다
적어도 카.IsWhiteSpaceLatin1(charc)이 가장 많을 때 5번 판단해야 돼요.
이렇게 간단한 방법이 왜 이렇게 복잡합니까?
 
C# 성능 최적화 》나의 이 문장의 마지막 절은char 유형에 대한 처리를 말한다
여기에 공간을 바꾸는 최적화 방식이 있다. 공간을 바꾸는 시간이라고 하지만 실제적으로 낭비하는 공간이 많지 않다. 왜냐하면char는 최대 65536 길이이기 때문이다.
이 점을 이용하면 나는 완전히 스스로 하나를 실현할 수 있다
/// <summary>          
/// </summary>
private static bool[] _WhiteChars = InitWhiteChars();
/// <summary>     _WhiteChars
/// </summary>
/// <returns></returns>
private static bool[] InitWhiteChars()
{
    var arr = new bool[char.MaxValue];
    for (int i = char.MinValue; i <= char.MaxValue; i++)
    {
        if (char.IsWhiteSpace((char)i)) //         
        {
            arr[i] = true;//            true
        }
    }
    return arr;
}

/// <summary>           null、           。(        )
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsNullOrWhiteSpace(this string str)
{
    if (str == null)
    {
        return true;
    }
    var length = str.Length;
    if (str.Length == 0)
    {
        return true;
    }
    if (_WhiteChars[str[0]] == false)
    {
        return false;
    }
    for (int i = 1; i < length; i++)
    {
        if (_WhiteChars[str[i]] == false)
        {
            return false;
        }
    }
    return true;
}

네, 맞아요. 두 가지 방법 중 하나예요. 정적 방법이에요. 전체적으로 한 번만 실행할 수 있어요.
판단할 때 하나의 그룹 인덱스로 값을 얻는 동작만 있습니다.true를 꺼내면 공백 문자임을 증명합니다.얼마나 간단한 논리인가.
체계적인 방법은 제가 깊이 연구하지 못했는데...... 만 아니면 CharUnicodeInfo.인터넷 GetCategoryValue 방법은 실행 중 되돌아오는 결과를 바꿀 수 있습니다. 그렇지 않으면 제 방법은 시스템 방법의 되돌아오는 값과 같습니다.
이치에 맞다
/// <summary>       Unicode           。(        )
/// </summary>
/// <param name="str">     Unicode   。</param>
/// <returns></returns>
public static bool IsWhiteSpace(this char value)
{
    return _WhiteChars[value];
}

뒷말


갓 배우다.net 때 csdn 은 여전히 매우 핫했다. 어렴풋이 기억 을 당시 csdn 포럼 에는 각양각색 의 공격 포스터 가 있었는데 그 중 에는 많은 도전 시스템 방법 이 있었다
   http://bbs.csdn.net/topics/360117794 그 중 한 편의 공격 포스터
바로 그때 나는 시스템 방법도 결국 사람이 쓴 것일 뿐, 사람이라면 반드시 남남이 존재한다는 것을 알게 되었다
기술은 바로 고대 무학과 같다. (나는 항상 디자인 모델을 무공의 체계에 비유한다.) 이른바 문무제일무제이라는 것은 무공의 좋고 나쁨을 비교해 보면 알 수 있고 기술도 마찬가지다.
많이 배우고, 많이 연구하고, 많이 관찰하고, 많이 테스트한다.진정으로 한 방법, 한 종류를 이해하면, 너는 자연히 그의 좋고 나쁨을 알게 된다
누구를 맹목적으로 숭배하지 마라, XXX라면 반드시 최고다!내 N년의 경험에 의하면, 이렇게 하는 것이 가장 좋다.설득력도 없어!모두 프로그램 원숭이들이니, 우리 코드로 이야기하자.

광고.


더 많은 C# 기술 교류, 환영합니다:5946699;암호: C# 커뮤니케이션
C# 좋아하시고, C# 사랑하시고, 지금 C# 공부하시고, C# 공부하시려는 분들은 여기 오셔서 서로 공부하고 교류하시면서 함께 발전하세요.
그룹채팅 개설자는 나야. 문제가 있으면 그룹에서 @ 나, 우리 함께 토론하고 연구하자.

좋은 웹페이지 즐겨찾기