programing

Visual Studio 2015 및 IFormat Provider(CA1305)의 문자열 보간

telebox 2023. 5. 12. 22:02
반응형

Visual Studio 2015 및 IFormat Provider(CA1305)의 문자열 보간

Visual Studio 2015의 새로운 문자열 보간 스타일은 다음과 같습니다.

Dim s = $"Hello {name}"

그러나 이것을 사용하면 코드 분석에서 CA1305를 중단한다고 표시됩니다. IFormatProvider 지정

옛날에는 이렇게 했습니다.

Dim s = String.Format(Globalization.CultureInfo.InvariantCulture, "Hello {0}", name)

하지만 새로운 스타일로 어떻게 할 수 있을까요?

에 대한 해결책을 찾고 있다는 점을 언급해야 합니다.넷 4.5.2(용).Net 4.6 dcastro가 정답입니다.)

당신은 사용할 것입니다.System.FormattableString또는System.IFormattable클래스:

IFormattable ifs = (IFormattable)$"Hello, {name}";
System.FormattableString fss = $"Hello, {name}";

// pass null to use the format as it was used upon initialization above.
string ifresult = ifs.ToString(null, CultureInfo.InvariantCulture);
string fsresult = fss.ToString(CultureInfo.InvariantCulture);

프레임워크 4.6에 대해 컴파일해야 합니다.IFormattable그리고.FormattableString이전 버전에는 없는 클래스입니다.이전 버전을 대상으로 하는 경우에는NET 프레임워크 오류를 트리거하지 않고는 보간 구문을 사용할 수 없습니다.

약간의 해킹을 적용하지 않는 한(존 스키트의 요지에서 4.6 RTM에 대해 컴파일하도록 조정되어 계정으로 포크됨).다음을 포함하는 클래스 파일을 프로젝트에 추가하기만 하면 됩니다.

갱신하다

이제 프로젝트에 동일한 기능을 제공하는 Nuget 패키지도 사용할 수 있습니다(이것을 @habakuk에 알려주셔서 감사합니다).

install-package StringInterpolationBridge

또는 제품에 어셈블리를 추가하지 않고 동일한 작업을 수행하려면 다음 코드를 프로젝트에 추가합니다.

namespace System.Runtime.CompilerServices
{
    internal class FormattableStringFactory
    {
        public static FormattableString Create(string messageFormat, params object[] args)
        {
            return new FormattableString(messageFormat, args);
        }
    }
}

namespace System
{
    internal class FormattableString : IFormattable
    {
        private readonly string messageFormat;
        private readonly object[] args;

        public FormattableString(string messageFormat, object[] args)
        {
            this.messageFormat = messageFormat;
            this.args = args;
        }

        public override string ToString()
        {
            return string.Format(messageFormat, args);
        }

        public string ToString(string format, IFormatProvider formatProvider)
        {
            return string.Format(formatProvider, format ?? messageFormat, args);
        }

        public string ToString(IFormatProvider formatProvider)
        {
            return string.Format(formatProvider, messageFormat, args);
        }
    }
}

참조:

만약 당신이 목표로 한다면요.NET Framework 4.6, 문자열 보간이 암시적으로 변환 가능하다는 사실을 활용할 수 있습니다.FormattableString:

Thomas Levesque의 C# 6 문자열 보간 사용자 정의에서

이 기능의 덜 알려진 측면은 보간된 문자열이 다음 중 하나로 처리될 수 있다는 것입니다.String또는 로서IFormattable문맥에 따라

static string Invariant(FormattableString formattable)
{
    return formattable.ToString(CultureInfo.InvariantCulture);
}

string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");

Microsoft는 문자열 보간을 보다 쉽게 사용하고 CA1305: Specify IFormatProvider를 준수할 수 있도록 지원했습니다.

C# 6 이상을 사용하는 경우 지침에 액세스할 수 있습니다.

추가로, 정적 방법.FormattableString.Invariant 사용할 수 있습니다.NET 표준 1.3, .NET Core 1.0 및 .NET Framework 4.6 이상.이 두 가지를 함께 사용하면 다음 작업을 수행할 수 있습니다.

using static System.FormattableString;

string name = Invariant($"Hello {name}");

그러나 현재 문화를 통해 보간을 수행하는 것이 목표라면, 동반 정적 방법입니다.FormattableString.CurrentCulture 제안되어 있습니다.NET Core 3.0(현재, Preview 5):

using static System.FormattableString;

string name = CurrentCulture($"Hello {name}");

제시하우잉이 답변에서 제시한 코드를 다루는 누겟 패키지를 찾았습니다.

Nuget 패키지 'StringInterpolationBridge'(소스)는 모든 프로젝트에 이 코드를 추가합니다.

언급URL : https://stackoverflow.com/questions/32076823/string-interpolation-in-visual-studio-2015-and-iformatprovider-ca1305

반응형