بررسی ویژگی Params Collections در C# 13
نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۰۸/۳۰ ۲۱:۰۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace CS13Tests;
public static class ParamsCollectionsTests
{
public static void CallSum() => Console.WriteLine(Sum(1, 2, 3));
private static int Sum(params int[] values) => values.Sum();
}namespace CS13Tests
{
public static class ParamsCollectionsTests
{
public static void CallSum()
{
Console.WriteLine(ParamsCollectionsTests.Sum(new int[3]
{
1,
2,
3
}));
}
[NullableContext(1)]
private static int Sum([ParamArray] params int[] values)
{
return ((IEnumerable<int>) values).Sum();
}
}
}namespace CS13Tests;
public static class ParamsCollectionsTests
{
public static void CallPrintNumbersCS12()
{
List<int> numbers = [1, 2, 3];
PrintNumbersCS12([..numbers]); // array
}
private static void PrintNumbersCS12(params int[] array) => Console.WriteLine(string.Join(separator: ", ", array));
}System.Span<T> System.ReadOnlySpan<T> System.Collections.Generic.IEnumerable<T> System.Collections.Generic.IReadOnlyCollection<T> System.Collections.Generic.IReadOnlyList<T> System.Collections.Generic.ICollection<T> System.Collections.Generic.IList<T>
public static class ParamsCollectionsTests
{
public static void CallSumCS13() => Console.WriteLine(SumCS13(1, 2, 3));
private static int SumCS13(params ReadOnlySpan<int> values)
{
var sum = 0;
foreach (var item in values)
{
sum += item;
}
return sum;
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
namespace CS13Tests
{
public static class ParamsCollectionsTests
{
public static void CallSumCS13()
{
Console.WriteLine(ParamsCollectionsTests.SumCS13(RuntimeHelpers.CreateSpan<int>(__fieldref (<PrivateImplementationDetails>.4636993D3E1DA4E9D6B8F87B79E8F7C6D018580D52661950EABC3845C5897A4D4))));
}
private static int SumCS13([ParamCollection, ScopedRef] ReadOnlySpan<int> values)
{
int sum = 0;
ReadOnlySpan<int> readOnlySpan = values;
for (int index = 0; index < readOnlySpan.Length; ++index)
{
int item = readOnlySpan[index];
sum += item;
}
return sum;
}
}
}namespace CS13Tests;
public static class ParamsCollectionsTests
{
public static void CallCalculateSumCS13() => Console.WriteLine(CalculateSumCS13(1, 2, 3));
private static int CalculateSumCS13(params List<int> numbers) => numbers.Sum();
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace CS13Tests
{
public static class ParamsCollectionsTests
{
public static void CallCalculateSumCS13()
{
int num1 = 3;
List<int> intList = new List<int>(num1);
CollectionsMarshal.SetCount<int>(intList, num1);
Span<int> span = CollectionsMarshal.AsSpan<int>(intList);
int index1 = 0;
span[index1] = 1;
int index2 = index1 + 1;
span[index2] = 2;
int index3 = index2 + 1;
span[index3] = 3;
int num2 = index3 + 1;
Console.WriteLine(ParamsCollectionsTests.CalculateSumCS13(intList));
}
[NullableContext(1)]
private static int CalculateSumCS13([ParamCollection] List<int> numbers)
{
return numbers.Sum();
}
}
}namespace CS13Tests;
public static class ParamsCollectionsTests
{
public static void WriteNames(params string[] names) => Console.WriteLine(string.Join(separator: ", ", names));
public static void WriteNames(params ReadOnlySpan<string> names)
=> Console.WriteLine(string.Join(separator: ", ", names));
public static void WriteNames(params IEnumerable<string> names)
=> Console.WriteLine(string.Join(separator: ", ", names));
}namespace CS13Tests;
public static class ParamsCollectionsTests
{
public static void CallWriteNames()
{
var persons = new List<Person>
{
new(FirstName: "Vahid", LastName: "N"),
new(FirstName: "User1", LastName: "L1"),
new(FirstName: "User2", LastName: "L2")
};
// IEnumerable overload is used
WriteNames(persons.Select(person => person.FirstName));
// array overload is used
WriteNames(new[]
{
"Vahid", "User1", "User2"
});
// most efficient overload is used: currently ReadOnlySpan
WriteNames("Vahid", "User1", "User2");
}
private record Person(string FirstName, string LastName);
}