Egyszerűsített osztály implementálása automatikusan implementált tulajdonságokkal (C# programozási útmutató)
Ez a példa bemutatja, hogyan hozhat létre egy nem módosítható, egyszerűsített osztályt, amely csak az automatikusan implementált tulajdonságok készletének beágyazására szolgál. Ilyen típusú szerkezetet használjon a szerkezet helyett, ha referenciatípus-szemantikát kell használnia.
A megváltoztathatatlan tulajdonságot a következő módokon teheti meg:
- Deklarálja csak a lekéréses tartozékot, amely a típus konstruktorán kívül mindenhol megváltoztathatatlantá teszi a tulajdonságot.
- Deklaráljon egy inicializálási tartozékot a
set
tartozék helyett, amely a tulajdonságot csak a konstruktorban vagy egy objektum inicializáló használatával teszi áttekinthetővé. - Deklarálja a készlet tartozékát privátnak. A tulajdonság a típuson belül állítható be, de a felhasználók számára nem módosítható.
Hozzáadhatja a módosítót a required
tulajdonságdeklarációhoz, hogy kényszerítse a hívókat a tulajdonság beállítására egy új objektum inicializálásának részeként.
Az alábbi példa bemutatja, hogyan különbözik egy csak lekéréses tartozékot tartalmazó tulajdonság, mint a get és a privát készlet.
class Contact
{
public string Name { get; }
public string Address { get; private set; }
public Contact(string contactName, string contactAddress)
{
// Both properties are accessible in the constructor.
Name = contactName;
Address = contactAddress;
}
// Name isn't assignable here. This will generate a compile error.
//public void ChangeName(string newName) => Name = newName;
// Address is assignable here.
public void ChangeAddress(string newAddress) => Address = newAddress;
}
Példa
Az alábbi példa két módszert mutat be az automatikusan implementált tulajdonságokkal rendelkező nem módosítható osztály implementálására. Minden mód egy privát set
tulajdonsággal deklarálja az egyik tulajdonságot, a másikat pedig csak egy get
tulajdonsággal. Az első osztály csak konstruktort használ a tulajdonságok inicializálásához, a második osztály pedig egy statikus gyári metódust használ, amely konstruktort hív meg.
// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// constructor to initialize its properties.
class Contact
{
// Read-only property.
public string Name { get; }
// Read-write property with a private set accessor.
public string Address { get; private set; }
// Public constructor.
public Contact(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
}
// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{
// Read-write property with a private set accessor.
public string Name { get; private set; }
// Read-only property.
public string Address { get; }
// Private constructor.
private Contact2(string contactName, string contactAddress)
{
Name = contactName;
Address = contactAddress;
}
// Public factory method.
public static Contact2 CreateContact(string name, string address)
{
return new Contact2(name, address);
}
}
public class Program
{
static void Main()
{
// Some simple data sources.
string[] names = ["Terry Adams","Fadi Fakhouri", "Hanying Feng",
"Cesar Garcia", "Debra Garcia"];
string[] addresses = ["123 Main St.", "345 Cypress Ave.", "678 1st Ave",
"12 108th St.", "89 E. 42nd St."];
// Simple query to demonstrate object creation in select clause.
// Create Contact objects by using a constructor.
var query1 = from i in Enumerable.Range(0, 5)
select new Contact(names[i], addresses[i]);
// List elements cannot be modified by client code.
var list = query1.ToList();
foreach (var contact in list)
{
Console.WriteLine("{0}, {1}", contact.Name, contact.Address);
}
// Create Contact2 objects by using a static factory method.
var query2 = from i in Enumerable.Range(0, 5)
select Contact2.CreateContact(names[i], addresses[i]);
// Console output is identical to query1.
var list2 = query2.ToList();
// List elements cannot be modified by client code.
// CS0272:
// list2[0].Name = "Eugene Zabokritski";
}
}
/* Output:
Terry Adams, 123 Main St.
Fadi Fakhouri, 345 Cypress Ave.
Hanying Feng, 678 1st Ave
Cesar Garcia, 12 108th St.
Debra Garcia, 89 E. 42nd St.
*/
A fordító minden automatikusan implementált tulajdonsághoz létrehoz háttérmezőket. A mezők nem érhetők el közvetlenül a forráskódból.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: