首页新闻找找看学习计划

.NET Core Span<T>:传字符串参数问题

0
悬赏园豆:200 [已解决问题] 解决于 2019-08-28 14:46

比如下面的代码,调用方法时直接传 string 类型的参数然后在所调用方法中 AsSpan ,与先 AsSpan 然后调用方法,在性能上有区别吗?

public bool ContainsAllOf(string s)
{
    return ContainsAllOf(s.AsSpan());
}

public bool ContainsAllOf(ReadOnlySpan<char> span)
{
    return ContainsAllOf(span);
}
dudu的主页 dudu | 高人七级 | 园豆:41257
提问于:2019-08-27 21:40
< >
分享
最佳答案
0

没有区别的。第二种方法都不用事先AsSpan() 直接在调用时传入string 参数即可。

无论是先AsSpan() 还是后AsSpan() 都是只有一个返回string参数首地址“指针”的过程,并且 函数参数的string sspan<char> span 都是一个指向堆内存的引用,只不过二者的功能特性不同。传入一个地址而已,我认为对性能并无区别

收获园豆:150
Shendu.CC | 小虾三级 |园豆:1947 | 2019-08-27 21:43

2个方法名相同,不 AsSpan 不行

dudu | 园豆:41257 (高人七级) | 2019-08-27 21:52
其他回答(1)
0

Corefx 里就是这样用的,提供语法糖方便使用而已,同时可以减少重复代码。

https://github.com/dotnet/corefx/blob/2a0f48da86297f9e60f5f5257dbb7eee1cbb5a3e/src/Common/src/CoreLib/System/Boolean.cs#L236

public static bool TryParse(string? value, out bool result)
{
    if (value == null)
    {
        result = false;
        return false;
    }

    return TryParse(value.AsSpan(), out result);
}

public static bool TryParse(ReadOnlySpan<char> value, out bool result)
{
    if (IsTrueStringIgnoreCase(value))
    {
        result = true;
        return true;
    }

    if (IsFalseStringIgnoreCase(value))
    {
        result = false;
        return true;
    }

    // Special case: Trim whitespace as well as null characters.
    value = TrimWhiteSpaceAndNull(value);

    if (IsTrueStringIgnoreCase(value))
    {
        result = true;
        return true;
    }

    if (IsFalseStringIgnoreCase(value))
    {
        result = false;
        return true;
    }

    result = false;
    return false;
}
收获园豆:50
沈星繁 | 园豆:552 (小虾三级) | 2019-08-27 21:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册