Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Alanları ayrı model türlerini birleştirmeden paylaşmak için, F# 11'den başlayarak kullanılabilen kayıt yaymalarını kullanın.
Alan bildirimlerini yeni bir adlandırılmış kayda katkıda bulunmak veya adlandırılmış veya ...expression anonim bir kayda alan değerleri eklemek için kullanın...Type. Bildirim yeniden kullanımı ve değer eşlemesi bağımsız seçeneklerdir.
Kayıt türleri oluşturma
Bağlantı alanlarını yapılandırma türleri arasında paylaşmak için yeni bir kayıt bildirimine yayılın Endpoint :
type Endpoint = { Host: string; Port: int }
type ClientOptions =
{ ...Endpoint
TimeoutSeconds: int }
ClientOptions, Portve TimeoutSecondsvarHost. Ayrı bir nominal türdür, alt tür değildir Endpoint .
Aynı tür tanımında birden çok kaynak ve açık bildirim görünebilir:
type Logging = { LogLevel: string }
type LoggedClientOptions = { ...ClientOptions; ...Logging }
Yalnızca kayıt alanları katılır. Yöntemler, kayıt alanı olmayan özellikler ve statik üyeler kopyalanmamıştır. Kaynak, anonim bir kaydın kısaltması da dahil olmak üzere adlandırılmış bir kayıt veya anonim bir kayıt türü olabilir. Bir tür yayma hedefi adlandırılmış bir kayıt türü olmalıdır.
Kayıt değerleri oluşturma
Uç noktayı istemci seçeneklerine kopyalayın, ardından konağı değiştirmek için anonim bir kayıt kullanın:
let local = { Host = "localhost"; Port = 5432 }
let options: ClientOptions = { ...local; TimeoutSeconds = 30 }
let remote = {| ...options; Host = "db.example.com" |}
printn $"{remote.Host}:{remote.Port}, timeout {remote.TimeoutSeconds}s"
// db.example.com:5432, timeout 30s
İfade spreadleri, yapı kayıtları da dahil olmak üzere adlandırılmış veya anonim kayıt kaynaklarını ve hedeflerini kabul eder. Her hedef alan bir değer almalıdır. Açık bir hedef ek açıklaması, birkaç adlandırılmış kayıt türü etiketleri paylaştığında kullanışlıdır.
Alanın türünü güçlendirme
Sonraki bir alan bildirimi, bir spread alanının türünü değiştirebilir. Örneğin, ile type CustomerId = CustomerId of System.Guidayrıştırılmış bir tanımlayıcıyı temsil edin ve ardından içeri aktarılan bir kaydı şu tanımlayıcıya sahip bir kayıttan ayırt edin:
type ImportedCustomer = { Name: string; Id: string }
type IdentifiedCustomer = { ...ImportedCustomer; Id: CustomerId }
let identify (source: ImportedCustomer) =
match Guid.TryParse source.Id with
| true, id -> Ok ({ ...source; Id = CustomerId id }: IdentifiedCustomer)
| false, _ -> Error "Invalid customer identifier."
Guid.TryParse metni doğrular; yalnızca spread alanları kopyalar.
CustomerId başka kurallar uygulamadan tanımlayıcıları diğer GUID'lerden ayırt eder.
Bağımsız modelleri birleştirme
Seçilen nominal kayıttan ve anonim bir kayıt türünden bildirimler oluşturup bağımsız kaynaklardan değerleri birleştirin:
type PublicProductFields = { Name: string; UnitPrice: decimal }
type ProductRow = { ...PublicProductFields; InternalCost: decimal }
type StockCounts = {| InStock: int; Reserved: int |}
type ProductCard =
{ ...PublicProductFields
...StockCounts
CanOrder: bool }
let product: ProductRow =
{ Name = "Notebook"; UnitPrice = 12.50m; InternalCost = 4m }
let stock: StockCounts = {| InStock = 8; Reserved = 2 |}
let card: ProductCard =
{ ...product; ...stock; CanOrder = stock.InStock > stock.Reserved }
let viewState = {| ...card; Selected = false |}
let selected = {| ...viewState; Selected = true |}
Adlandırılmış ve anonim kaynaklar sağlar ProductCard; kart daha sonra anonim görünüm durumunu sağlar.
CanOrder bir kez hesaplanır, sonraki bir yapıda sayımlar değiştiğinde yeniden hesaplanmaz.
Bilinen bir hedefe Project
Hedef türü, tutulacak alanları seçer. Birden çok kaynak değişiklik sağlayabilir:
let endpoint: Endpoint = { ...options }
let overrides = {| Host = "db.example.com"; Port = 5433 |}
let production: ClientOptions =
{ ...options; ...overrides; TimeoutSeconds = 60 }
printn $"{endpoint.Host}:{endpoint.Port}"
printn $"{production.Host}:{production.Port}, timeout {production.TimeoutSeconds}s"
// localhost:5432
// db.example.com:5433, timeout 60s
endpoint yalnızca Host ve Porttutar; production kaynakları ve açık geçersiz kılmaları birleştirir. Hedefte bulunmayan açık alanlar hata olarak kalır.
Ek açıklama eklemeden yapılan anonim kayıt, katkıda bulunan tüm alanları alır. Adlandırılmış hedef çıkarılabilir olmalıdır. Bilinmeyen kaynaklar, işlev parametresi gibi (source: ClientOptions) kendi ek açıklamalarına ihtiyaç duyar.
Alan sırası ve geçersiz kılmalar
Katkılar soldan sağa okunur. Yinelenen alan adı için en sağdaki katkı kazanır. Kural hem türlerdeki alan bildirimlerine hem de ifadelerdeki alan değerlerine uygulanır.
let laterHost = {| Host = "db.example.com" |}
let corrected: Endpoint = { ...local; ...laterHost; Port = 5433 }
Türü geçersiz kıldıktan sonra, değiştirme türünün değerini girin. gibi { Host = "first"; Host = "second" }yinelenen açık alanlar hata olarak kalır.
Tür bildirimleri için, kazanan katkı konumunda kazanan bir alan görüntülenir. Bir kaynaktan gelen alanlar, kaynak sıralarını korur. Bu düzen, oluşturucular ve imza uyumluluğu için önemlidir.
Değerlendirme ve kopyalama
Yayılım kaynak ifadeleri, sağladıkları her alanın yerine daha sonraki bir katkı geçse bile kaynak sırada bir kez çalıştırılır:
let visits = ResizeArray<string>()
let hostFrom source host =
visits.Add source
{| Host = host |}
let selected =
{| ...hostFrom "first" "localhost"
...hostFrom "second" "db.example.com" |}
assert (selected.Host = "db.example.com")
assert (Seq.toList visits = [ "first"; "second" ])
Spread'ler, sığ alan kopyalarıyla ve açık atamalarla aynı dönüştürmelerle yeni bir kayıt oluşturur. Alanlar tarafından başvurulan değiştirilebilir nesneler paylaşılan olarak kalır.
İç içe alan güncelleştirmeleri, kopyalama ve güncelleştirmede olduğu gibi spread'lerle çalışır:
let original = {| Connection = local; Retries = 3 |}
let changed = {| ...original; Connection.Port = 5433 |}
assert (changed.Connection.Port = 5433)
assert (original.Connection.Port = 5432)
Daha sonraki bir katkı, Connection bu alana daha önce iç içe yerleştirilmiş bir güncelleştirmeyi değiştirir. Geçersiz kılmaları gereken yayılmalardan sonra kasıtlı geçersiz kılmalar yerleştirin.
Gölgeli alanlar hakkında uyarılar
Daha sonraki bir yayma, açık bir seçimi yanlışlıkla geri alabilir. Derleyici varsayılan olarak şu uyarıları bildirir:
| Warning | Meaning |
|---|---|
| FS3897 | Türünden yayılan bir alan, önceki açık alan bildirimini gölgeler. |
| FS3898 | İfadeden alınan bir alan, önceki açık alan bağlamalarını gölgeler. |
Örneğin, { Host = "db.example.com"; ...local } ' den localalırHost, değil "db.example.com".
Diğer çakışmaları denetlemek için şu kabul etme uyarılarını etkinleştirin:
| Warning | Meaning |
|---|---|
| FS3905 | Bir tür, önceki bir tür yayılmasından bir alanı gölgeler. |
| FS3906 | Açık bir alan, önceki bir yayılmadan bir alanı gölgeler. |
| FS3907 | Bir ifade, önceki bir ifadenin yayıldığı alanı gölgeler. |
<WarnOn>$(WarnOn);3905;3906;3907</WarnOn>
Bu bildirimler en sağdaki kazanç davranışını değiştirmez.
Gösterim ve API uyumluluğu
Tür, kopya alanı değişkenliğini ve alan düzeyi özniteliklerini yayılır. Tür düzeyi öznitelikleri kopyalamaz; temsilini hedefin kendi [<Struct>] özniteliği belirler. Kaynak türü bağımsız değişkenleri, ölçü birimi kısıtlamaları da dahil olmak üzere kaynağın genel kısıtlamalarını karşılamalıdır.
Important
Tür yaymalarını yalnızca paylaşılan evrim kasıtlı olduğunda kullanın. Kaynak alan değişikliği, hedefte düzenleme yapmadan hedefin genel alanlarını, oluşturucuyu, özniteliklerini veya kısıtlamalarını değiştirebilir.
Spread'ler erişilebilirlik denetimlerini atlamaz. Null atanabilir kayıtlar geçerli yayılma kaynakları değildir; kullanmadan önce null değer atanabilir değerin null olmadığını belirleyin. Yaymalar aracılığıyla döngüsel bağımlılıklar reddedilir. Normal özyinelemeli kayıt alanları yalnızca bildirimde bir spread de kullanıldığı için yasak değildir.
Tür, dosyalarda .fsi çalışmayı yayılır. Bir imza, uygulama yayılırken açık alanları veya sonuçta elde edilen alanların ve bunların sırasının kabul edilmesi koşuluyla tersini kullanabilir. Tırnak işaretleri, bir yayılma düğümü değil ayrıntılı kayıt oluşturmayı içerir.
Spread'leri seçin veya kopyalayıp güncelleştirin
Bir kaynaktan aynı tür güncelleştirme için kopyalama ve güncelleştirme ifadelerini kullanın. Kaynakları birleştirmek, farklı bir kayıt türüne yansıtmak veya alan bildirimlerini yeniden kullanmak için spread'leri kullanın. ve ... öğesini aynı kayıt ifadesinde birleştirmeyinwith.
Yaymalar koleksiyonlar, nesne ifadeleri, rastgele .NET nesneleri veya C# kayıtları için geçerli değildir. Kayıt deseni söz dizimi sağlamaz. Kayıt oluşturucuları ayrı bir F# 11.2 özelliğidir.