Span/ReadOnlySpan temelleri (C# 6 öykünmesi)
Span/ReadOnlySpan yapılarını ArraySegment ile öykünün: diziler üzerinde görünümler oluşturun, ofset/uzunluk ile dilimleyin ve verileri kopyalamadan işleyin.
Span/ReadOnlySpan temelleri (C# 6 öykünmesi), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
Dilimler neden önemlidir
Amaç: Ek bellek ayırmadan dilimlerle çalışmak.
- Görünüm olarak ArraySegment<T> kullanınız
- ofset ve sayıya göre dilimleyiniz
- ArraySegment<T> kabul eden yöntemler yazınız
- İşlemleri basit ve güvenli tutunuz
Kopyasız görünüm
ArraySegment<T>, dizinin bir bölümü üzerinde kopyasız bir görünümdür. Dilim kopyaları oluşturmaktan kaçınmak için bunu yöntemlere geçiriniz.
using System;
public class Program
{
static int Sum(ArraySegment<int> seg)
{
int acc = 0;
int end = seg.Offset + seg.Count;
for (int i = seg.Offset; i < end; i++) acc += seg.Array[i];
return acc;
}
public static void Main(string[] args)
{
int[] data = new int[] { 2, 4, 6, 8, 10 };
ArraySegment<int> middle3 = new ArraySegment<int>(data, 1, 3); // 4,6,8
Console.WriteLine("Sum = " + Sum(middle3)); // 18
}
}
İç içe dilimler
Mevcut bir segmentin alt aralığını almak için bir Slice yardımcısı oluşturabilirsiniz. Böylece yine kopyasız çalışılır.
using System;
public static class Seg
{
public static ArraySegment<T> Slice<T>(ArraySegment<T> seg, int start, int count)
{
if (start < 0 || count < 0 || start + count > seg.Count) throw new ArgumentOutOfRangeException();
return new ArraySegment<T>(seg.Array, seg.Offset + start, count);
}
}
public class Program
{
public static void Main(string[] args)
{
string[] words = new string[] { "alpha", "beta", "gamma", "delta", "epsilon" };
ArraySegment<string> mid = new ArraySegment<string>(words, 1, 3); // beta, gamma, delta
ArraySegment<string> inner = Seg.Slice<string>(mid, 1, 1); // gamma
Console.WriteLine(inner.Array[inner.Offset]); // gamma
}
}
Görünüm üzerinden yerinde işlem
Alt dizeler oluşturmaktan kaçınmak için ofset/sayı üzerinden işlem yapınız; bu, ReadOnlySpan tabanlı kırpma yaklaşımını yansıtır.
using System;
public static class SegOps
{
public static ArraySegment<char> Trim(ArraySegment<char> seg)
{
int start = seg.Offset;
int end = seg.Offset + seg.Count - 1;
while (start <= end && Char.IsWhiteSpace(seg.Array[start])) start++;
while (end >= start && Char.IsWhiteSpace(seg.Array[end])) end--;
int newCount = (end >= start) ? (end - start + 1) : 0;
return new ArraySegment<char>(seg.Array, start, newCount);
}
}
public class Program
{
public static void Main(string[] args)
{
char[] buf = " hello world ".ToCharArray(); // single allocation for chars
ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);
ArraySegment<char> trimmed = SegOps.Trim(all);
// Print the trimmed part without new string:
for (int i = 0; i < trimmed.Count; i++)
Console.Write(trimmed.Array[trimmed.Offset + i]);
Console.WriteLine();
}
}
İhtiyaç halinde somutlaştırma
Bazen gerçek bir kopyaya ihtiyaç duyarsınız. Segmenti yeni bir diziye yalnızca sınırda Materialize ediniz.
using System;
public static class SegCopy
{
public static T[] ToArray<T>(ArraySegment<T> seg)
{
T[] copy = new T[seg.Count];
Array.Copy(seg.Array, seg.Offset, copy, 0, seg.Count);
return copy;
}
}
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
ArraySegment<int> view = new ArraySegment<int>(data, 2, 3); // 3,4,5
int[] materialized = SegCopy.ToArray<int>(view); // copy only when you must
Console.WriteLine(string.Join(",", materialized));
}
}
İpuçları ve sınırlar
İpuçları:
- Diziler üzerinde çalışırken API'leri ArraySegment<T> kabul edecek şekilde tasarlayınız.
- ofset ve sayıyı takip ediniz.
- Kopyalamayı yalnızca sınır noktalarında (G/Ç, birlikte çalışabilirlik) yapınız.
- Modern Span güvenlik ve yığın görünümleri sunar; burada dilimleme yaklaşımını öğrenmek için segmentleri kullanıyoruz.
C# 6'da dilim taklidi
Özet
Özet: Alt aralıkları görüntülemek için ArraySegment<T> kullanınız, segment kabul eden API'ler yazınız, ofset/sayı üzerinden işlem yapınız ve yalnızca gerektiğinde kopyalayınız.
Sıkça Sorulan Sorular
“Span/ReadOnlySpan temelleri (C# 6 öykünmesi)” dersi ücretsiz mi?
Evet — “Span/ReadOnlySpan temelleri (C# 6 öykünmesi)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“Span/ReadOnlySpan temelleri (C# 6 öykünmesi)” dersinde ne öğreneceğim?
Span/ReadOnlySpan yapılarını ArraySegment ile öykünün: diziler üzerinde görünümler oluşturun, ofset/uzunluk ile dilimleyin ve verileri kopyalamadan işleyin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 1. dersidir.
“Span/ReadOnlySpan temelleri (C# 6 öykünmesi)” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Span/ReadOnlySpan temelleri (C# 6 öykünmesi)
- Memory/ReadOnlyMemory öykünmesi: kopyasız pencereler
- Dizeyi Span olarak kullanan API'ler (C# 6 öykünmesi)