Güvenli olmayan kod yapılarındaki hataları ve uyarıları düzeltme

Bu makale aşağıdaki derleyici tanılamalarını kapsar:

  • CS0193: * veya -> işleci bir işaretçiye uygulanmalıdır
  • CS0196: İşaretçi yalnızca bir değerle dizine alınmalıdır
  • CS0208: Yönetilen türün adresini alamaz, boyutunu alamaz veya işaretçi bildiremez ('type')
  • CS0209: Bildirilen ifadede yerel bir fixed türünün işaretçi türünde olması gerekir
  • CS0210: fixed veya using deyimi bildirimi için bir başlatıcı sağlamalısınız
  • CS0211: Verilen ifadenin adresi alınamıyor
  • CS0212: Yalnızca bir ifade başlatıcısının içinde sabitlenmemiş bir fixed ifadenin adresini alabilirsiniz
  • CS0213: Zaten sabit olan bir ifadenin adresini almak için fixed deyimini kullanamazsınız
  • CS0214: İşaretçiler ve sabit boyutlu arabellekler yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS0227: Güvenli olmayan kod yalnızca ile derleniyorsa /unsafegörünebilir
  • CS0233: 'tanımlayıcı' önceden tanımlanmış bir boyuta sahip olmadığından, sizeof yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS0242: Söz konusu işlem geçersiz işaretçilerde tanımlanmamış
  • CS0244: İşaretçi türlerinde 'is' veya 'as' geçerli değil
  • CS0254: Sabit deyim atamasının sağ tarafı bir atama ifadesi olmayabilir
  • CS0459: Salt okunur bir yerel değişkenin adresi alınamıyor
  • CS0821: Örtük olarak yazılan yerel değişkenler düzeltilemez
  • CS1641: Sabit boyutlu arabellek alanı, alan adından sonra dizi boyutu belirticisine sahip olmalıdır
  • CS1642: Sabit boyutlu arabellek alanları yalnızca yapıların üyesi olabilir
  • CS1656: 'salt okunur değişken türü' olduğundan 'değişken' atanamıyor
  • CS1663: Sabit boyutlu arabellek türü aşağıdakilerden biri olmalıdır: bool, byte, short, int, long, , char, , sbyte, ushort, uintulongfloat veya double
  • CS1664: Uzunluğu 'length' ve türü 'type' olan sabit boyutlu arabellek çok büyük
  • CS1665: Sabit boyutlu arabelleklerin uzunluğu sıfırdan büyük olmalıdır
  • CS1666: Sabitlenmemiş ifadelerde bulunan sabit boyutlu arabellekleri kullanamazsınız. Sabit deyimini kullanmayı deneyin.
  • CS1708: Sabit boyutlu arabelleklere yalnızca yerel ayarlar veya alanlar aracılığıyla erişilebilir
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' özniteliğini kullanmayın. Bunun yerine 'sabit' alan değiştiricisini kullanın.
  • CS1919: Nesne oluşturmada güvenli olmayan tür 'tür adı' kullanılamaz
  • CS4004: Güvenli olmayan bir bağlamda olamaz await
  • CS7092: Sabit arabellek yalnızca bir boyuta sahip olabilir.
  • CS8372: Bir özellikte 'System.Runtime.CompilerServices.FixedBuffer' özniteliğini kullanmayın
  • CS8385: Verilen ifade sabit bir deyimde kullanılamaz
  • CS8500: Bu işlem, yönetilen bir türün ('type') adresini alır, boyutunu alır veya işaretçisini bildirir
  • CS8812: 'method' &method grubu 'type' işlev dışı işaretçi türüne dönüştürülemiyor.
  • CS9049: Sabit alan bir başvuru alanı olmamalıdır.
  • CS9123: '&' işleci, zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır.
  • CS9360: Bu işlem yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS9361: stackalloc içinde SkipLocalsInit başlatıcı olmayan ifade yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS9362: RequiresUnsafe veya extern olarak işaretlendiğinden 'üye' güvenli olmayan bir bağlamda kullanılmalıdır
  • CS9363: İmzasında işaretçiler olduğundan 'üye' güvenli olmayan bir bağlamda kullanılmalıdır
  • CS9364: Güvenli olmayan üye 'üye' 'üye' güvenli üyeyi geçersiz kılamaz
  • CS9365: Güvenli olmayan eleman 'üye', güvenli eleman 'üye'yi örtük olarak uygulayamaz
  • CS9366: Güvenli olmayan üye 'üye', güvenli üye 'üye'yi implemente edemez
  • CS9367: RequiresUnsafeAttribute bu simgeye uygulanamaz.
  • CS9368: RequiresUnsafeAttribute yalnızca güncelleştirilmiş bellek güvenliği kuralları altında geçerlidir.
  • CS9376: RequiresUnsafe
  • CS9377: 'unsafe' değiştiricisinin geçerli bellek güvenliği kuralları altında hiçbir etkisi yoktur.
  • CS9379: Kaynakta 'RequiresUnsafeAttribute' kullanmayın; bunun yerine 'unsafe' değiştiricisini kullanın.
  • CS9388: 'safe' değiştiricisi yalnızca '' olarak işaretlenmemişextern 'unsafe' üyelerinde kullanılabilir.
  • CS9389: 'extern' üyesi '' veya 'unsafesafe' olarak işaretlenmelidir.
  • CS9390: Her iki kısmi üye bildirimi de 'safe' olarak işaretlenmelidir veya hiçbiri 'safe' olarak işaretlenemez

İşaretçi işlemleri ve işaretçi çözme

  • CS0193: * veya -> işleci bir işaretçiye uygulanmalıdır
  • CS0196: İşaretçi yalnızca bir değerle dizine alınmalıdır
  • CS0242: Söz konusu işlem geçersiz işaretçilerde tanımlanmamış

İşaretçi işlemlerini doğru kullanmak için başvuru kaldırma, dizin oluşturma ve aritmetik işlemlere yönelik kuralları izleyin. Daha fazla bilgi için bkz . İşaretçi türleri ve İşlev işaretçileri.

  • * veya -> işlecini yalnızca veri işaretçilerine (CS0193) uygulayın. Bu işleçleri noktalayıcı olmayan türlerde veya işlev işaretçileriyle kullanmayın. C/C++ dilinden farklı olarak, C# dilinde işlev göstericilerini dereference edemezsiniz.
  • Yalnızca bir değere sahip dizin işaretçileri (CS0196). İşaretçilerde çok boyutlu dizin oluşturma desteklenmez.
  • Void işaretçilerinde tanımsız işlemlerden kaçının (CS0242). Örneğin, derleyici işaret edilen verilerin boyutunu bilmediğinden boşluk işaretçisini artırmayın.

İşaretçi türleri ve yönetilen türler

  • CS0208: Yönetilen bir türün adresini alamaz, boyutunu hesaplayamaz veya işaretçisini bildiremez ('type')
  • CS0233: 'tanımlayıcı' önceden tanımlanmış bir boyuta sahip olmadığından, sizeof yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS8500: Bu, yönetilen bir türün ('type') adresini alır, boyutunu belirler veya ona işaretçi bildirimi yapar

İşaretçilerle ve sizeof işleçle doğru şekilde çalışmak için yönetilmeyen türleri ve uygun bağlamları kullanın. Daha fazla bilgi için bkz. Yönetilmeyen türler ve sizeof işleç.

  • İşaretçileri yalnızca yönetilmeyen türlerle (CS0208) kullanın. Yönetilen türlerin adresini almayın, boyutunu almayın veya işaretçileri tanımlamayın. Yönetilen türler, başvuru türü alanlarını veya özelliklerini içeren başvuru türlerini ve yapıları içerir.
  • Boyutu derleme zamanı sabiti olmayan türlerle çalışırken bir sizeof bağlamında unsafe işlecini kullanın (CS0233).
  • Bir yönetilen türün (CS8500) adresini almaktan, boyutunu almaktan veya ona işaretçi tanımlamaktan kaçının. Derleyici yönetilen türlerde işaretçi işlemlerini algıladığında bu uyarı (düzey 4) tetiklenir. Yönetilen bir tür, herhangi bir başvuru tipi veya alanı ya da özelliği olarak bir başvuru tipi içeren herhangi bir yapıdır. Daha fazla bilgi için bkz. Yönetilmeyen türler.

Sabit deyim kullanımı

  • CS0209: Fixed bir ifadede bildirilen yerel değişkenin türü bir işaretçi türü olmalıdır
  • CS0210: Sabit veya using deyimi bildiriminde bir başlatıcı sağlamanız gerekir
  • CS0211: Verilen ifadenin adresi alınamıyor
  • CS0212: Sabit bir deyim başlatıcısının içinde yalnızca sabitlenmemiş ifadenin adresini alabilirsiniz
  • CS0213: Sabit deyimini kullanarak zaten sabit olan bir ifadenin adresini alamazsınız
  • CS0254: Sabit deyim atamasının sağ tarafı bir atama ifadesi olmayabilir
  • CS0459: Salt okunur bir yerel değişkenin adresini almak mümkün değil
  • CS0821: Örtük olarak yazılan yerel değişkenler düzeltilemez
  • CS1656: 'salt okunur değişken türü' olduğundan 'değişken' atanamıyor
  • CS8385: Verilen ifade sabit bir deyimde kullanılamaz

Bu hatalar, fixed ifadeyi yanlış kullandığınızda oluşur. deyimi fixed , çöp toplayıcının taşınabilir bir değişkeni yeniden konumlandırmasını engeller ve bu değişkene bir işaretçi bildirir. Daha fazla bilgi için bkz. Güvenli olmayan kod ve işaretçiler.

fixed deyimini doğru kullanmak için:

  • Değişkeni işaretçi türü (CS0209) olarak bildirin.
  • fixed deyim bildiriminde bir başlatıcı sağlayın (CS0210).
  • Yalnızca geçerli ifadelerin adresini alın: alanlar, yerel değişkenler ve işaretçi dolaylı (CS0211). İki değişkenin toplamı gibi hesaplanan ifadelerin adresini almayın.
  • Düzeltilmemiş ifadelerde yalnızca fixed deyim başlatıcısı (CS0212) içinde adres alma işlecini kullanın.
  • Zaten sabit olan ifadelerde (fixed) deyimi kullanmayın. Bir unsafe yöntemdeki yerel değişkenler ve parametreler yığında zaten sabittir.
  • Bir fixed deyimi atamasının sağ tarafında dönüşüm ifadeleri kullanmayın (CS0254).
  • Salt okunur yerel değişkenlerin (CS0459) adresini almayın. Döngülerdeki foreach, using deyimleri ve fixed ifadelerinde yer alan değişkenler salt okunurdur. Bu hata artık derleyicinin geçerli sürümleri tarafından üretilmemiştir.
  • var ifadelerinde fixed yerine açık türler kullanın (CS0821).
  • Salt okunur bağlamlardaki değişkenlere, örneğin foreach döngülerde, using deyimlerde veya fixed deyimlerde (CS1656) atama yapmayın.
  • Yalnızca bir fixed deyimde sabitlemeyi destekleyen ifadeler kullanın (CS8385). İfade adreslenebilir bir değişken, dize veya uygun GetPinnableReference bir yöntem uygulayan bir tür olmalıdır.

Güvenli olmayan bağlam gereksinimleri

  • CS0214: İşaretçiler ve sabit boyutlu arabellekler yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS0227: Güvenli olmayan kod yalnızca /unsafe ile derleniyorsa görünebilir
  • CS0244: İşaretçi türlerinde 'is' veya 'as' geçerli değil
  • CS1919: Nesne oluşturmada güvenli olmayan tür 'tür adı' kullanılamaz
  • CS4004: Güvenli olmayan bir bağlamda olamaz await
  • CS9123: '&' işleci zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır
  • CS9360: Bu işlem yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS9361: stackalloc içinde SkipLocalsInit başlatıcı olmayan ifade yalnızca güvenli olmayan bir bağlamda kullanılabilir
  • CS9362: RequiresUnsafe veya extern şeklinde işaretlendiğinden, 'member' güvenli olmayan bir bağlamda kullanılmalıdır
  • CS9363: ‘Üye’, imzasında işaretçiler bulunduğu için tehlikeli bir bağlamda kullanılmalıdır
  • CS9376: RequiresUnsafe

Bu tanılamalar, gerekli unsafe bağlam olmadan güvenli olmayan kod yapıları kullandığınızda veya güvenli olmayan türlerle izin verilmeyen işlemleri denediğinizde oluşur. Daha fazla bilgi için bkz . Güvenli olmayan kod, işaretçiler ve unsafe anahtar sözcük.

  • İşaretçiler veya sabit boyutlu arabellekler kullanan yöntemleri, türleri veya kod bloklarını anahtar sözcüğüyle unsafe (CS0214) işaretleyin. Derleyici, işaretçi türleri veya sabit boyutlu arabellek alanlarıyla çalışan tüm kodlar için açık bir güvenli olmayan bağlam gerektirir.
  • Proje ayarlarınızda AllowUnsafeBlocks derleyici seçeneğini etkinleştirin (CS0227). Bu seçenek olmadan, kod aksi takdirde doğru olsa bile derleyici tüm unsafe blokları reddeder.
  • is veya as işleçlerini işaretçi türleriyle (CS0244) kullanmayın. İşaretçiler tür hiyerarşisine katılmadığından, bu tür testi işleçleri işaretçiler için geçerli değildir.
  • İşaretçi türü örnekleri (new) oluşturmak için işlecini kullanmayın. Yönetilmeyen bellekte nesne oluşturmak için, işaretçi döndüren yerel yöntemleri çağırmak için birlikte çalışma kullanın.
  • Güvenli olmayan kodu zaman uyumsuz koddan (CS4004) ayrı tutun. Çalışma zamanı, askıya alma noktaları boyunca işaretçilerin geçerliliğini garanti edemediğinden, derleyici await bloğu içindeki unsafe ifadelerine izin vermez. Güvensiz işlemler için ayrı yöntemler oluşturun ve bu yöntemleri eşzamansız yöntemlerden çağırın.
  • Zaman uyumsuz yöntemlerde (&CS9123) parametrelerde veya yerel değişkenlerde işleç adresini () kullanmayın. Asenkron işlem bir askıya alma noktasından sonra devam ettiğinde, değişken bellek yığında bulunmayabilir.
  • Güvenli olmayan yapılar içeren işlemleri (işaretçi başvuru kaldırma, adres alma veya sizeof, yönetilmeyen türler gibi) unsafe anahtar kelimesini kullanarak işaretleyin (CS9360). C# 15'in güncelleştirilmiş bellek güvenliği kuralları altında, derleyici güvenli olmayan bağlam gerektiren tek tek işlemleri tanımlar.
  • unsafe özniteliği uygulandığında, stackalloc başlatıcısı olmayan ifadeler için SkipLocalsInit anahtar sözcüğünü kullanın (CS9361). Başlatıcı olmadan yığına ayrılan bellek, başlatılmamış veri içerir; bu da güvenli olmayan bir işlemdir.
  • Bir unsafe bağlam kullanın; RequiresUnsafe veya extern ile işaretlenmiş üyeleri (CS9362), ya da imzalarında işaretçileri olan üyeleri (CS9363) çağırırken. C# 15 derleyicisi, yalnızca bildirimde değil, çağrı sitesinde güvenli olmayan üye kullanımını izler.
  • unsafe bağlamını, new() kısıtlaması ile RequiresUnsafe veya extern ile işaretlenmiş bir oluşturucu çağrılması gerektiğinde (CS9376) kullanın. Genel örnekleme oluşturucuyu örtük olarak çağırır, bu nedenle çağrı bağlamı güvenli olmamalıdır.

Güvenli olmayan üye güvenlik sözleşmeleri

  • CS9364: Güvensiz üye 'üye', güvenli üye 'üye'yi geçersiz kılamaz
  • CS9365: Güvenli olmayan üye 'üye' örtük olarak güvenli üye 'üye' uygulayamaz
  • CS9366: Güvenli olmayan 'üye', güvenli 'üye' olarak uygulanamaz
  • CS9367: RequiresUnsafeAttribute bu simgeye uygulanamaz.
  • CS9368: RequiresUnsafeAttribute yalnızca güncelleştirilmiş bellek güvenliği kuralları altında geçerlidir.
  • CS9377: 'unsafe' değiştiricisinin geçerli bellek güvenliği kuralları altında hiçbir etkisi yoktur.
  • CS9379: Kaynakta 'RequiresUnsafeAttribute' kullanmayın; bunun yerine 'unsafe' değiştiricisini kullanın.
  • CS9388: 'safe' değiştiricisi yalnızca '' olarak işaretlenmemişextern 'unsafe' üyelerinde kullanılabilir.
  • CS9389: 'extern' üyesi '' veya 'unsafesafe' olarak işaretlenmelidir.
  • CS9390: Her iki kısmi üye bildiriminin de 'safe' olarak işaretlenmesi gerekir veya hiçbiri 'safe' olarak işaretlenemez

Bu tanılamalar, güvenli olmayan olarak işaretlenen üyeler için C# 15 güvenlik sözleşmesi kurallarını zorunlu kılar. Derleyici, güvenli olmayan üyelerin temel sınıflar ve arabirimler tarafından oluşturulan güvenlik beklentilerini ihlal etmemesini sağlar. Daha fazla bilgi için bkz . Güvenli olmayan kod, işaretçiler ve unsafe anahtar sözcük.

  • Güvensiz bir üyeyle (CS9364) güvenli bir taban üyeyi değiştirmeyin. Geçersiz kılma, temel üyenin güvenlik sözleşmesini korumalıdır. Temel üye güvenliyse geçersiz kılmanın da güvenli olması gerekir. Değiştiriciyi unsafe veya RequiresUnsafeAttribute geçersiz kılınan üyeden kaldırın veya temel üyeyi güvenli değil olarak işaretleyin.
  • Güvenli bir arabirim üyesini, güvenli olmayan bir üye ile örtük olarak uygulamayın (CS9365). Bir tür bir arabirim üyesini örtük olarak uyguladığında, arabirimi kullananlar güvenli bir işlem bekler. Güvenli olmayan atamayı uygulayan üyeden kaldırın veya açık arabirim uygulamasını kullanın.
  • Güvenli olmayan bir üyeyle (CS9366) güvenli bir arabirim üyesini açıkça uygulamayın. Açık uygulamada bile, arabirim üyesinin güvenlik sözleşmesi korunmalıdır.
  • Yalnızca desteklenen simge türlerine (RequiresUnsafeAttribute) uygulayın. Bu öznitelik yöntemlere, özelliklere, olaylara, oluşturuculara ve türlere uygulanabilir, ancak tüm sembol türleri bunu desteklemez.
  • Güncelleştirilmiş bellek güvenliği kurallarının kullanılmasını RequiresUnsafeAttribute etkinleştirin (CS9368). Bu öznitelik C# 15'in geliştirilmiş bellek güvenliği modelinin bir parçasıdır ve eski kurallar altında tanınmaz. Projenizin güncelleştirilmiş kuralları destekleyen bir dil sürümünü hedeflediğinden emin olun.
  • Hiçbir etkisi olmadığında değiştiriciyi unsafe kaldırın (CS9377). Geçerli bellek güvenliği kuralları kapsamında, belirli bağlamlar değiştiriciyi gerektirmez veya bundan yararlanmaz unsafe . Derleyici, gereksiz ek açıklamaları temizleyebilmeniz için değiştirici anlamsız olduğunda uyarır.
  • unsafe değiştiricisini, kaynakta RequiresUnsafeAttribute uygulamak yerine, doğrudan üye bildiriminde kullanın (CS9379). özniteliği yalnızca meta veri gösterimine yöneliktir; kaynak kodunda unsafe anahtar sözcük doğru mekanizmadır.
  • Değiştiriciyi safe yalnızca henüz işaretlenmemiş extern üyelere unsafe (CS9388) uygulayın. safe değiştiricisi, bir extern üyesini extern bildirimleri için geçerli olan varsayılan unsafe varsayımının dışında açıkça tutar.
  • Her extern üyeyi unsafe veya safe olarak işaretleyin (CS9389). Güncelleştirilmiş bellek güvenliği kuralları altında, derleyici uygulamayı doğrulayamadığından extern üyelerin güvenlik sözleşmelerini açıkça bildirmesi gerekir.
  • Her iki kısmi üye bildiriminin de safe değiştiricisi konusunda aynı olduğundan emin olun (CS9390). Kısmi bildirimlerden biri safe olarak işaretlenmişse, tutarlı bir güvenlik sözleşmesini korumak için diğerinin de safe olarak işaretlenmesi gerekir.

Sabit boyutlu arabellekler

  • CS1641: Sabit boyutlu arabellek alanı, alan adından sonra dizi boyutu belirticisine sahip olmalıdır
  • CS1642: Sabit boyutlu arabellek alanları yalnızca yapıların üyesi olabilir
  • CS1663: Sabit boyutlu arabellek türü aşağıdakilerden biri olmalıdır: bool, byte, short, int, long, , char, , sbyte, ushort, uintulongfloat veya double
  • CS1664: Uzunluğu 'length' ve türü 'type' olan sabit boyutlu arabellek çok büyük
  • CS1665: Sabit boyutlu arabelleklerin uzunluğu sıfırdan büyük olmalıdır
  • CS1666: Sabitlenmemiş ifadelerde bulunan sabit boyutlu arabelleği kullanamazsınız. Fixed deyimini kullanmayı deneyin.
  • CS1708: Sabit boyutlu arabelleklere yalnızca yerel değişkenler veya alanlar aracılığıyla erişilebilir
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' özniteliğini kullanmayın. Bunun yerine 'sabit' alan değiştiricisini kullanın.
  • CS7092: Sabit arabellek yalnızca bir boyuta sahip olabilir.
  • CS8372: Bir özellikte 'System.Runtime.CompilerServices.FixedBuffer' özniteliğini kullanmayın
  • CS9049: Sabit alan bir başvuru alanı olmamalıdır.

Bu hatalar, sabit boyutlu arabelleklerle çalışırken oluşur. Sabit boyutlu arabellekler doğrudan struct'lara eklenmiş dizilerdir ve öncelikle enteroperabilite senaryoları için kullanılır. Daha fazla bilgi için bkz. Sabit boyutlu arabellekler.

Sabit boyutlu arabellekleri doğru şekilde tanımlamak ve kullanmak için:

  • Pozitif bir tamsayı sabiti (CS1641, CS1665) kullanarak alan adından sonraki dizi boyutunu belirtin. Arabelleğin toplam boyutu (öğe sayısı öğe boyutuyla çarpılır) 2^31 baytı (CS1664) aşmamalıdır.
  • Sabit boyutlu arabellekleri sınıflarda değil yalnızca yapılarda (CS1642) bildirin. Bir sınıfta alana ihtiyacınız varsa normal bir dizi kullanın.
  • Desteklenen öğe türlerinden birini kullanın: bool, byte, short, int, , long, char, , sbyteushortuintulongfloatveya double (CS1663).
  • Arabelleğe erişmeden önce içeren yapıyı sabitlemek için bir fixed ifadesi kullanın (CS1666).
  • Sabit boyutlu arabelleklere yalnızca yerel değişkenler veya alanlar aracılığıyla erişin, aracı ifadeler (CS1708) üzerinden değil.
  • fixed Özniteliği (System.Runtime.CompilerServices.FixedBuffer) yerine alan değiştiricisini kullanın. Bu özniteliği özelliklere de uygulamayın (CS8372).
  • Yalnızca bir boyuta (CS7092) sahip sabit arabellekler bildirin. Çok boyutlu sabit arabellekler desteklenmez.
  • Sabit boyutlu arabellekleri alan olarak ref bildirmeyin (CS9049). Sabit boyutlu arabellekler değer alanları olmalıdır.

İşlev işaretçileri

  • CS8812: 'method' metot grubu 'type' işlev olmayan işaretçi türüne dönüştürülemiyor.

İşlev işaretçisi almak için açık işlev işaretçisi türü tür atamasıyla işlecin adresini kullanın. Yöntem gruplarını & veya işlev dışı diğer işaretçi türlerini atamak için kullanmayın. Daha fazla bilgi için bkz . İşlev işaretçileri.