Присвоение значения для ссылочного типа в C#

Вы также можете установить размер шрифта и стиль шрифта, используя что-то вроде этого. Это немного больше, чем вы просите, но, эй, какого чёрта ...

[myButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:13.0]];

И ... если вы чувствуете себя резвым, список доступных шрифтов можно найти, реализовав этот код, а затем проверив вывод в вашем отладчике xCode.

Код:

NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
NSArray *fontNames;
NSInteger indFamily, indFont;
for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
{
    NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
    fontNames = [[NSArray alloc] initWithArray:
            [UIFont fontNamesForFamilyName:
            [familyNames objectAtIndex:indFamily]]];
    for (indFont=0; indFont<[fontNames count]; ++indFont)
    {
        NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
    }
}

Пример:

2012-04-02 11:36:34.395 MyApp[3579:707] Family name: Thonburi
2012-04-02 11:36:34.398 MyApp[3579:707]     Font name: Thonburi-Bold
2012-04-02 11:36:34.402 MyApp[3579:707]     Font name: Thonburi
2012-04-02 11:36:34.405 MyApp[3579:707] Family name: Snell Roundhand
2012-04-02 11:36:34.408 MyApp[3579:707]     Font name: SnellRoundhand-Bold
2012-04-02 11:36:34.411 MyApp[3579:707]     Font name: SnellRoundhand-Black
2012-04-02 11:36:34.415 MyApp[3579:707]     Font name: SnellRoundhand
2012-04-02 11:36:34.418 MyApp[3579:707] Family name: Academy Engraved LET
2012-04-02 11:36:34.421 MyApp[3579:707]     Font name: AcademyEngravedLetPlain
2012-04-02 11:36:34.424 MyApp[3579:707] Family name: Marker Felt
2012-04-02 11:36:34.427 MyApp[3579:707]     Font name: MarkerFelt-Wide
2012-04-02 11:36:34.430 MyApp[3579:707]     Font name: MarkerFelt-Thin
2012-04-02 11:36:34.434 MyApp[3579:707] Family name: Geeza Pro
2012-04-02 11:36:34.437 MyApp[3579:707]     Font name: GeezaPro-Bold
2012-04-02 11:36:34.441 MyApp[3579:707]     Font name: GeezaPro
2012-04-02 11:36:34.445 MyApp[3579:707] Family name: Arial Rounded MT Bold
2012-04-02 11:36:34.448 MyApp[3579:707]     Font name: ArialRoundedMTBold
2012-04-02 11:36:34.451 MyApp[3579:707] Family name: Trebuchet MS
2012-04-02 11:36:34.455 MyApp[3579:707]     Font name: TrebuchetMS
2012-04-02 11:36:34.458 MyApp[3579:707]     Font name: TrebuchetMS-Bold
2012-04-02 11:36:34.461 MyApp[3579:707]     Font name: TrebuchetMS-Italic
2012-04-02 11:36:34.464 MyApp[3579:707]     Font name: Trebuchet-BoldItalic
2012-04-02 11:36:34.467 MyApp[3579:707] Family name: Arial
2012-04-02 11:36:34.471 MyApp[3579:707]     Font name: Arial-BoldMT
2012-04-02 11:36:34.474 MyApp[3579:707]     Font name: ArialMT
2012-04-02 11:36:34.477 MyApp[3579:707]     Font name: Arial-ItalicMT
2012-04-02 11:36:34.480 MyApp[3579:707]     Font name: Arial-BoldItalicMT
2012-04-02 11:36:34.483 MyApp[3579:707] Family name: Marion
2012-04-02 11:36:34.487 MyApp[3579:707]     Font name: Marion-Regular
2012-04-02 11:36:34.491 MyApp[3579:707]     Font name: Marion-Bold
2012-04-02 11:36:34.494 MyApp[3579:707]     Font name: Marion-Italic
2012-04-02 11:36:34.503 MyApp[3579:707] Family name: Gurmukhi MN
2012-04-02 11:36:34.507 MyApp[3579:707]     Font name: GurmukhiMN
2012-04-02 11:36:34.511 MyApp[3579:707]     Font name: GurmukhiMN-Bold
2012-04-02 11:36:34.514 MyApp[3579:707] Family name: Malayalam Sangam MN
2012-04-02 11:36:34.518 MyApp[3579:707]     Font name: MalayalamSangamMN-Bold
2012-04-02 11:36:34.522 MyApp[3579:707]     Font name: MalayalamSangamMN
2012-04-02 11:36:34.525 MyApp[3579:707] Family name: Bradley Hand
2012-04-02 11:36:34.529 MyApp[3579:707]     Font name: BradleyHandITCTT-Bold
2012-04-02 11:36:34.532 MyApp[3579:707] Family name: Kannada Sangam MN
2012-04-02 11:36:34.536 MyApp[3579:707]     Font name: KannadaSangamMN
2012-04-02 11:36:34.540 MyApp[3579:707]     Font name: KannadaSangamMN-Bold
2012-04-02 11:36:34.544 MyApp[3579:707] Family name: Bodoni 72 Oldstyle
2012-04-02 11:36:34.548 MyApp[3579:707]     Font name: BodoniSvtyTwoOSITCTT-Book
2012-04-02 11:36:34.552 MyApp[3579:707]     Font name: BodoniSvtyTwoOSITCTT-Bold
2012-04-02 11:36:34.555 MyApp[3579:707]     Font name: BodoniSvtyTwoOSITCTT-BookIt
2012-04-02 11:36:34.559 MyApp[3579:707] Family name: Cochin
2012-04-02 11:36:34.562 MyApp[3579:707]     Font name: Cochin
2012-04-02 11:36:34.566 MyApp[3579:707]     Font name: Cochin-BoldItalic
2012-04-02 11:36:34.570 MyApp[3579:707]     Font name: Cochin-Italic
2012-04-02 11:36:34.573 MyApp[3579:707]     Font name: Cochin-Bold
2012-04-02 11:36:34.577 MyApp[3579:707] Family name: Sinhala Sangam MN
2012-04-02 11:36:34.581 MyApp[3579:707]     Font name: SinhalaSangamMN
2012-04-02 11:36:34.584 MyApp[3579:707]     Font name: SinhalaSangamMN-Bold
2012-04-02 11:36:34.588 MyApp[3579:707] Family name: Hiragino Kaku Gothic ProN
2012-04-02 11:36:34.592 MyApp[3579:707]     Font name: HiraKakuProN-W6
2012-04-02 11:36:34.596 MyApp[3579:707]     Font name: HiraKakuProN-W3
2012-04-02 11:36:34.599 MyApp[3579:707] Family name: Papyrus
2012-04-02 11:36:34.603 MyApp[3579:707]     Font name: Papyrus-Condensed
2012-04-02 11:36:34.607 MyApp[3579:707]     Font name: Papyrus
2012-04-02 11:36:34.614 MyApp[3579:707] Family name: Verdana
2012-04-02 11:36:34.620 MyApp[3579:707]     Font name: Verdana
2012-04-02 11:36:34.626 MyApp[3579:707]     Font name: Verdana-Bold
2012-04-02 11:36:34.674 MyApp[3579:707]     Font name: Verdana-BoldItalic
2012-04-02 11:36:34.690 MyApp[3579:707]     Font name: Verdana-Italic
2012-04-02 11:36:34.730 MyApp[3579:707] Family name: Zapf Dingbats
2012-04-02 11:36:34.748 MyApp[3579:707]     Font name: ZapfDingbatsITC
2012-04-02 11:36:34.752 MyApp[3579:707] Family name: Courier
2012-04-02 11:36:34.757 MyApp[3579:707]     Font name: Courier-Bold
2012-04-02 11:36:34.762 MyApp[3579:707]     Font name: Courier
2012-04-02 11:36:34.769 MyApp[3579:707]     Font name: Courier-BoldOblique
2012-04-02 11:36:34.778 MyApp[3579:707]     Font name: Courier-Oblique
2012-04-02 11:36:34.786 MyApp[3579:707] Family name: Hoefler Text
2012-04-02 11:36:34.793 MyApp[3579:707]     Font name: HoeflerText-Black
2012-04-02 11:36:34.802 MyApp[3579:707]     Font name: HoeflerText-Italic
2012-04-02 11:36:34.810 MyApp[3579:707]     Font name: HoeflerText-Regular
2012-04-02 11:36:34.819 MyApp[3579:707]     Font name: HoeflerText-BlackItalic
2012-04-02 11:36:34.827 MyApp[3579:707] Family name: Euphemia UCAS
2012-04-02 11:36:34.836 MyApp[3579:707]     Font name: EuphemiaUCAS-Bold
2012-04-02 11:36:34.843 MyApp[3579:707]     Font name: EuphemiaUCAS
2012-04-02 11:36:34.848 MyApp[3579:707]     Font name: EuphemiaUCAS-Italic
2012-04-02 11:36:34.853 MyApp[3579:707] Family name: Helvetica
2012-04-02 11:36:34.857 MyApp[3579:707]     Font name: Helvetica-LightOblique
2012-04-02 11:36:34.863 MyApp[3579:707]     Font name: Helvetica
2012-04-02 11:36:34.873 MyApp[3579:707]     Font name: Helvetica-Oblique
2012-04-02 11:36:34.876 MyApp[3579:707]     Font name: Helvetica-BoldOblique
2012-04-02 11:36:34.880 MyApp[3579:707]     Font name: Helvetica-Bold
2012-04-02 11:36:34.884 MyApp[3579:707]     Font name: Helvetica-Light
2012-04-02 11:36:34.887 MyApp[3579:707] Family name: Hiragino Mincho ProN
2012-04-02 11:36:34.892 MyApp[3579:707]     Font name: HiraMinProN-W3
2012-04-02 11:36:34.898 MyApp[3579:707]     Font name: HiraMinProN-W6
2012-04-02 11:36:34.902 MyApp[3579:707] Family name: Bodoni Ornaments
2012-04-02 11:36:34.905 MyApp[3579:707]     Font name: BodoniOrnamentsITCTT
2012-04-02 11:36:34.923 MyApp[3579:707] Family name: Apple Color Emoji
2012-04-02 11:36:34.938 MyApp[3579:707]     Font name: AppleColorEmoji
2012-04-02 11:36:34.942 MyApp[3579:707] Family name: Optima
2012-04-02 11:36:34.946 MyApp[3579:707]     Font name: Optima-ExtraBlack
2012-04-02 11:36:34.950 MyApp[3579:707]     Font name: Optima-Italic
2012-04-02 11:36:34.954 MyApp[3579:707]     Font name: Optima-Regular
2012-04-02 11:36:34.965 MyApp[3579:707]     Font name: Optima-BoldItalic
2012-04-02 11:36:34.969 MyApp[3579:707]     Font name: Optima-Bold
2012-04-02 11:36:34.972 MyApp[3579:707] Family name: Gujarati Sangam MN
2012-04-02 11:36:34.985 MyApp[3579:707]     Font name: GujaratiSangamMN
2012-04-02 11:36:34.989 MyApp[3579:707]     Font name: GujaratiSangamMN-Bold
2012-04-02 11:36:34.993 MyApp[3579:707] Family name: Devanagari Sangam MN
2012-04-02 11:36:34.998 MyApp[3579:707]     Font name: DevanagariSangamMN
2012-04-02 11:36:35.002 MyApp[3579:707]     Font name: DevanagariSangamMN-Bold
2012-04-02 11:36:35.006 MyApp[3579:707] Family name: Times New Roman
2012-04-02 11:36:35.017 MyApp[3579:707]     Font name: TimesNewRomanPS-ItalicMT
2012-04-02 11:36:35.021 MyApp[3579:707]     Font name: TimesNewRomanPS-BoldMT
2012-04-02 11:36:35.032 MyApp[3579:707]     Font name: TimesNewRomanPSMT
2012-04-02 11:36:35.037 MyApp[3579:707]     Font name: TimesNewRomanPS-BoldItalicMT
2012-04-02 11:36:35.041 MyApp[3579:707] Family name: Kailasa
2012-04-02 11:36:35.045 MyApp[3579:707]     Font name: Kailasa
2012-04-02 11:36:35.050 MyApp[3579:707]     Font name: Kailasa-Bold
2012-04-02 11:36:35.053 MyApp[3579:707] Family name: Telugu Sangam MN
2012-04-02 11:36:35.064 MyApp[3579:707]     Font name: TeluguSangamMN-Bold
2012-04-02 11:36:35.068 MyApp[3579:707]     Font name: TeluguSangamMN
2012-04-02 11:36:35.071 MyApp[3579:707] Family name: Heiti SC
2012-04-02 11:36:35.099 MyApp[3579:707]     Font name: STHeitiSC-Medium
2012-04-02 11:36:35.107 MyApp[3579:707]     Font name: STHeitiSC-Light
2012-04-02 11:36:35.111 MyApp[3579:707] Family name: Futura
2012-04-02 11:36:35.115 MyApp[3579:707]     Font name: Futura-Medium
2012-04-02 11:36:35.119 MyApp[3579:707]     Font name: Futura-CondensedExtraBold
2012-04-02 11:36:35.122 MyApp[3579:707]     Font name: Futura-CondensedMedium
2012-04-02 11:36:35.135 MyApp[3579:707]     Font name: Futura-MediumItalic
2012-04-02 11:36:35.155 MyApp[3579:707] Family name: Bodoni 72
2012-04-02 11:36:35.160 MyApp[3579:707]     Font name: BodoniSvtyTwoITCTT-BookIta
2012-04-02 11:36:35.164 MyApp[3579:707]     Font name: BodoniSvtyTwoITCTT-Book
2012-04-02 11:36:35.168 MyApp[3579:707]     Font name: BodoniSvtyTwoITCTT-Bold
2012-04-02 11:36:35.171 MyApp[3579:707] Family name: Baskerville
2012-04-02 11:36:35.183 MyApp[3579:707]     Font name: Baskerville-SemiBoldItalic
2012-04-02 11:36:35.187 MyApp[3579:707]     Font name: Baskerville-Bold
2012-04-02 11:36:35.197 MyApp[3579:707]     Font name: Baskerville-Italic
2012-04-02 11:36:35.245 MyApp[3579:707]     Font name: Baskerville-BoldItalic
2012-04-02 11:36:35.253 MyApp[3579:707]     Font name: Baskerville-SemiBold
2012-04-02 11:36:35.258 MyApp[3579:707]     Font name: Baskerville
2012-04-02 11:36:35.262 MyApp[3579:707] Family name: Chalkboard SE
2012-04-02 11:36:35.266 MyApp[3579:707]     Font name: ChalkboardSE-Regular
2012-04-02 11:36:35.269 MyApp[3579:707]     Font name: ChalkboardSE-Bold
2012-04-02 11:36:35.279 MyApp[3579:707]     Font name: ChalkboardSE-Light
2012-04-02 11:36:35.284 MyApp[3579:707] Family name: Heiti TC
2012-04-02 11:36:35.288 MyApp[3579:707]     Font name: STHeitiTC-Medium
2012-04-02 11:36:35.299 MyApp[3579:707]     Font name: STHeitiTC-Light
2012-04-02 11:36:35.305 MyApp[3579:707] Family name: Copperplate
2012-04-02 11:36:35.310 MyApp[3579:707]     Font name: Copperplate
2012-04-02 11:36:35.313 MyApp[3579:707]     Font name: Copperplate-Light
2012-04-02 11:36:35.317 MyApp[3579:707]     Font name: Copperplate-Bold
2012-04-02 11:36:35.320 MyApp[3579:707] Family name: Party LET
2012-04-02 11:36:35.334 MyApp[3579:707]     Font name: PartyLetPlain
2012-04-02 11:36:35.338 MyApp[3579:707] Family name: American Typewriter
2012-04-02 11:36:35.351 MyApp[3579:707]     Font name: AmericanTypewriter-CondensedLight
2012-04-02 11:36:35.357 MyApp[3579:707]     Font name: AmericanTypewriter-Light
2012-04-02 11:36:35.361 MyApp[3579:707]     Font name: AmericanTypewriter-Bold
2012-04-02 11:36:35.364 MyApp[3579:707]     Font name: AmericanTypewriter
2012-04-02 11:36:35.368 MyApp[3579:707]     Font name: AmericanTypewriter-CondensedBold
2012-04-02 11:36:35.372 MyApp[3579:707]     Font name: AmericanTypewriter-Condensed
2012-04-02 11:36:35.384 MyApp[3579:707] Family name: AppleGothic
2012-04-02 11:36:35.400 MyApp[3579:707]     Font name: AppleGothic
2012-04-02 11:36:35.406 MyApp[3579:707] Family name: Bangla Sangam MN
2012-04-02 11:36:35.411 MyApp[3579:707]     Font name: BanglaSangamMN-Bold
2012-04-02 11:36:35.414 MyApp[3579:707]     Font name: BanglaSangamMN
2012-04-02 11:36:35.418 MyApp[3579:707] Family name: Noteworthy
2012-04-02 11:36:35.422 MyApp[3579:707]     Font name: Noteworthy-Light
2012-04-02 11:36:35.432 MyApp[3579:707]     Font name: Noteworthy-Bold
2012-04-02 11:36:35.436 MyApp[3579:707] Family name: Zapfino
2012-04-02 11:36:35.443 MyApp[3579:707]     Font name: Zapfino
2012-04-02 11:36:35.448 MyApp[3579:707] Family name: Tamil Sangam MN
2012-04-02 11:36:35.452 MyApp[3579:707]     Font name: TamilSangamMN
2012-04-02 11:36:35.456 MyApp[3579:707]     Font name: TamilSangamMN-Bold
2012-04-02 11:36:35.459 MyApp[3579:707] Family name: DB LCD Temp
2012-04-02 11:36:35.463 MyApp[3579:707]     Font name: DBLCDTempBlack
2012-04-02 11:36:35.467 MyApp[3579:707] Family name: Arial Hebrew
2012-04-02 11:36:35.471 MyApp[3579:707]     Font name: ArialHebrew
2012-04-02 11:36:35.475 MyApp[3579:707]     Font name: ArialHebrew-Bold
2012-04-02 11:36:35.479 MyApp[3579:707] Family name: Chalkduster
2012-04-02 11:36:35.482 MyApp[3579:707]     Font name: Chalkduster
2012-04-02 11:36:35.486 MyApp[3579:707] Family name: Georgia
2012-04-02 11:36:35.490 MyApp[3579:707]     Font name: Georgia-Italic
2012-04-02 11:36:35.493 MyApp[3579:707]     Font name: Georgia-BoldItalic
2012-04-02 11:36:35.497 MyApp[3579:707]     Font name: Georgia-Bold
2012-04-02 11:36:35.501 MyApp[3579:707]     Font name: Georgia
2012-04-02 11:36:35.504 MyApp[3579:707] Family name: Helvetica Neue
2012-04-02 11:36:35.508 MyApp[3579:707]     Font name: HelveticaNeue-Bold
2012-04-02 11:36:35.511 MyApp[3579:707]     Font name: HelveticaNeue-CondensedBlack
2012-04-02 11:36:35.515 MyApp[3579:707]     Font name: HelveticaNeue-Medium
2012-04-02 11:36:35.518 MyApp[3579:707]     Font name: HelveticaNeue
2012-04-02 11:36:35.522 MyApp[3579:707]     Font name: HelveticaNeue-Light
2012-04-02 11:36:35.526 MyApp[3579:707]     Font name: HelveticaNeue-CondensedBold
2012-04-02 11:36:35.529 MyApp[3579:707]     Font name: HelveticaNeue-LightItalic
2012-04-02 11:36:35.532 MyApp[3579:707]     Font name: HelveticaNeue-UltraLightItalic
2012-04-02 11:36:35.536 MyApp[3579:707]     Font name: HelveticaNeue-UltraLight
2012-04-02 11:36:35.540 MyApp[3579:707]     Font name: HelveticaNeue-BoldItalic
2012-04-02 11:36:35.543 MyApp[3579:707]     Font name: HelveticaNeue-Italic
2012-04-02 11:36:35.547 MyApp[3579:707] Family name: Gill Sans
2012-04-02 11:36:35.551 MyApp[3579:707]     Font name: GillSans-LightItalic
2012-04-02 11:36:35.555 MyApp[3579:707]     Font name: GillSans-BoldItalic
2012-04-02 11:36:35.558 MyApp[3579:707]     Font name: GillSans-Italic
2012-04-02 11:36:35.562 MyApp[3579:707]     Font name: GillSans
2012-04-02 11:36:35.565 MyApp[3579:707]     Font name: GillSans-Bold
2012-04-02 11:36:35.569 MyApp[3579:707]     Font name: GillSans-Light
2012-04-02 11:36:35.572 MyApp[3579:707] Family name: Palatino
2012-04-02 11:36:35.576 MyApp[3579:707]     Font name: Palatino-Roman
2012-04-02 11:36:35.580 MyApp[3579:707]     Font name: Palatino-Bold
2012-04-02 11:36:35.583 MyApp[3579:707]     Font name: Palatino-BoldItalic
2012-04-02 11:36:35.587 MyApp[3579:707]     Font name: Palatino-Italic
2012-04-02 11:36:35.591 MyApp[3579:707] Family name: Courier New
2012-04-02 11:36:35.594 MyApp[3579:707]     Font name: CourierNewPSMT
2012-04-02 11:36:35.598 MyApp[3579:707]     Font name: CourierNewPS-BoldMT
2012-04-02 11:36:35.601 MyApp[3579:707]     Font name: CourierNewPS-BoldItalicMT
2012-04-02 11:36:35.605 MyApp[3579:707]     Font name: CourierNewPS-ItalicMT
2012-04-02 11:36:35.608 MyApp[3579:707] Family name: Oriya Sangam MN
2012-04-02 11:36:35.612 MyApp[3579:707]     Font name: OriyaSangamMN-Bold
2012-04-02 11:36:35.616 MyApp[3579:707]     Font name: OriyaSangamMN
2012-04-02 11:36:35.619 MyApp[3579:707] Family name: Didot
2012-04-02 11:36:35.623 MyApp[3579:707]     Font name: Didot-Italic
2012-04-02 11:36:35.627 MyApp[3579:707]     Font name: Didot
2012-04-02 11:36:35.630 MyApp[3579:707]     Font name: Didot-Bold
2012-04-02 11:36:35.634 MyApp[3579:707] Family name: Bodoni 72 Smallcaps
2012-04-02 11:36:35.638 MyApp[3579:707]     Font name: BodoniSvtyTwoSCITCTT-Book
9
задан James Jones 30 June 2009 в 20:35
поделиться

11 ответов

Я бы хотел, чтобы был вариант ответа «второй лучший», потому что любой, кто упомянул Observer, заслуживает его. Шаблон наблюдателя будет работать, но в этом нет необходимости и, на мой взгляд, излишний.

Если нескольким объектам необходимо поддерживать ссылку на один и тот же объект («MyClass», ниже), и вам необходимо выполнить присвоения объекту, на который имеется ссылка ("MyClass"), самый простой способ справиться с этим - создать функцию ValueAssign следующим образом:

public class MyClass
{
    private int a;
    private int b;

    void ValueAssign(MyClass mo)
    {
        this.a = mo.a;
        this.b = mo.b;
    }
}

Observer будет необходим только в том случае, если другое действие потребовалось зависимые объекты на момент присвоения. Если вы хотите сохранить только ссылку, этот метод подойдет. Этот пример здесь такой же, как и пример, который я предложил в своем вопросе, но я чувствую, что он лучше подчеркивает мое намерение.

Спасибо за все ваши ответы. Я всерьез рассмотрел их все.

1
ответ дан 4 December 2019 в 13:04
поделиться

Я считаю, что вам следует использовать структуру вместо класса, поскольку структуры работают по значению, а не по ссылке.

2
ответ дан 4 December 2019 в 13:04
поделиться

Похоже, вы говорите о клонировании. Некоторые объекты будут поддерживать это (через ICloneable ), но большинство - нет. Во многих случаях это вообще не имеет смысла - что значит копировать объект FileStream ? ICloneable обычно считается плохим интерфейсом, отчасти потому, что он не определяет глубину клона.

Лучше попытаться изменить свой образ мышления, чтобы в этом не было необходимости. Я предполагаю, что вы программист на C ++ - и вообще не желаете выносить никаких суждений : не пытайтесь писать C # так, как если бы это C ++. Вы' В итоге получится унидиоматический C #, который может работать плохо, может быть неэффективным и может быть неинтуитивно понятным разработчикам C #.

Один из вариантов - попытаться сделать типы неизменяемыми там, где это возможно - в этот момент это не так имеет значение , есть ли копия, так как вы все равно не сможете изменить объект. Это подход, который используется в String , и он работает очень хорошо. Просто жаль, что в структуре нет неизменяемых коллекций (пока).

В вашем случае вместо метода ValueAssign у вас будет WithValue , который вернуть новый экземпляр только с измененным значением. (По общему признанию, это единственное доступное значение в вашем случае ...

6
ответ дан 4 December 2019 в 13:04
поделиться

Один из подходов - использовать конструктор копирования. например,

MyClass orig = ...; MyClass copy = new MyClass (orig);

Куда вы копируете элементы MyClass. В зависимости от того, сколько ссылочных типов содержит класс, это может включать рекурсивное использование конструкторов копирования.

1
ответ дан 4 December 2019 в 13:04
поделиться

Для того, что вы хотите сделать, я думаю, что A.ValueAssign (otherA) - лучший способ.

Учитывая, что вы хотите иметь одну ссылку на A, важно убедиться, что ссылка не уничтожена.

Не могли бы вы также использовать здесь одноэлементный шаблон?

2
ответ дан 4 December 2019 в 13:04
поделиться

У нас есть случаи, когда мы делаем именно то, о чем вы говорите. У нас есть много объектов, ссылающихся на конкретный экземпляр объекта, и мы хотим изменить экземпляр объекта, чтобы каждый объект, ссылающийся на этот существующий экземпляр, видел изменение.

Схема, которой мы следуем, почти такая же, как и у вас - только имена другие:

    class A
    {
        int i;
        public A(int i)
        {
            this.i = i;
        }
        public void Copy(A source)
        {
            this.i = source.i;
        }
    }
1
ответ дан 4 December 2019 в 13:04
поделиться

В нескольких приложениях на основе WinForms мне требовалась аналогичная функциональность, в моем случае, чтобы позволить форме ввода данных работать с копией объекта, информация из которого копируется на исходный объект только в том случае, если пользователь решит сохранить изменения.

Для выполнения этой работы я использовал идею из моих дней Delphi - метод Assign () .

По сути, я написал (ну, ok, сгенерировано) метод, который копирует свойства (и содержимое списка и т. д.) из одного экземпляра в другой. Это позволило мне написать такой код:

var person = PersonRespository.FindByName("Bevan");
...
var copy = new Person();
copy.Assign(person);
using (var form = new PersonDataEntryForm(copy))
{
    if (form.ShowAsModelessDialog() == MessageReturn.Save)
    {
        person.Assign(copy);
    }
}

Изменения, внесенные в диалоговом окне, являются частными, пока пользователь не решит их сохранить, затем обновляется общедоступная переменная ( person ).

An Метод Assign () для Person может выглядеть так:

public void Assign(Person source)
{
    Name = source.Name;
    Gender = source.Gender;
    Spouse = source.Spouse;

    Children.Clear();
    Children.AddRange( source.Children);
}

Кроме того, наличие метода Assign () делает копирующий конструктор почти тривиальным для написания:

public Person(Person original)
    : this()
{
    Assign(original);
}
1
ответ дан 4 December 2019 в 13:04
поделиться

Невозможно перегрузить оператор присваивания в C #, как это было бы в C / C ++. Однако, даже если бы это был вариант, я бы сказал, что вы пытаетесь исправить симптом, а не проблему. Ваша проблема в том, что присвоение новой ссылки нарушает код, почему бы просто не присвоить считанные значения исходной ссылке? и если вы боитесь, что другие могут создать новый объект и назначить его, сделайте объект одноэлементным или аналогичным, чтобы его нельзя было изменить после создания, но ссылка останется прежней

Ваша проблема в том, что присвоение новой ссылки нарушает код, почему бы просто не присвоить считанные значения исходной ссылке? и если вы боитесь, что другие могут создать новый объект и назначить его, сделайте объект одноэлементным или аналогичным, чтобы его нельзя было изменить после создания, но ссылка останется прежней

Ваша проблема в том, что присвоение новой ссылки нарушает код, почему бы просто не присвоить считанные значения исходной ссылке? и если вы боитесь, что другие могут создать новый объект и назначить его, сделайте объект одноэлементным или аналогичным, чтобы его нельзя было изменить после создания, но ссылка останется прежней

0
ответ дан 4 December 2019 в 13:04
поделиться

Другие предлагали в своем ответе клонирование, но это только часть дела. Вы также хотите использовать результаты (возможно, глубокого) клона для замены содержимого существующего объекта. Это очень похожее на C ++ требование.

Оно просто не очень часто встречается в C #, поэтому нет стандартного имени метода или оператора, означающего «заменить содержимое этого объекта копией содержимого этого объекта».

Причина, по которой это так часто встречается в C ++, заключается в необходимости отслеживать владение, чтобы можно было выполнить очистку. Если у вас есть член:

std::vector<int> ints;

У вас есть то преимущество, что он будет должным образом уничтожен при уничтожении окружающего объекта. Но если вы хотите заменить его новым вектором, вам понадобится swap , чтобы сделать это эффективным. В качестве альтернативы вы могли бы иметь:

std::vector<int> *ints;

Теперь вы можете легко поменять местами новый, но не забудьте сначала удалить старую, а затем в деструкторе включающего класса.

В C # вам не нужно об этом беспокоиться. Есть один правильный способ:

List<int> ints = new List<int>();

Вам не нужно его очищать, и вы можете заменить его на новый по ссылке. Лучшее из обоих.

Редактировать:

Если у вас есть несколько «клиентских» объектов, которые должны содержать ссылку на объект, и вы хотите иметь возможность заменить этот объект, вы должны сделать так, чтобы они содержали ссылку на промежуточный объект, который будет действовать как «оболочка».

class Replaceable<T>
{
    public T Instance { get; set; }
}

Другие классы будут содержать ссылку на Replaceable . Как и код, который необходимо заменить на замену. например

Replaceable<FileStream> _fileStream;

Также может быть полезно объявить событие, чтобы клиенты могли подписаться, чтобы узнать, когда сохраненный экземпляр был заменен.

1
ответ дан 4 December 2019 в 13:04
поделиться

Если я правильно понял, вы говорите о правильной десериализации синглтона.

  1. Если вы используете собственную сериализацию .Net, вы можете взглянуть на пример MSDN ISerializable . Пример показывает именно это - как переопределить ISerializable.GetObjectData , чтобы возвращать один и тот же экземпляр при каждом вызове.

  2. Если вы используете сериализацию Xml ( XmlSerializer ), то вы вручную реализуете IXmlSerializable в классе parent вашего объекта, а затем позаботьтесь о том, чтобы каждый раз получать единственный экземпляр.

  3. Самый простой способ - обеспечить это в установщике родительского свойства, обратившись к какой-то статический кеш. (Я считаю это довольно грязным, но это простой способ сделать это.)

Например:

 public class ParentClass
 {
      private ReferencedClass _reference;
      public ReferencedClass Reference
      {
          get
          { 
              return _reference;
          }
          set
          {
              // don't assign the value, but consult the
              // static dictionary to see if we already have
              // the singleton
              _reference = StaticCache.GetSingleton(value);
          }
      }
 }

И тогда у вас будет статический класс с каким-то словарем, из которого вы сможете быстро получить экземпляр синглтона (или создать его, если он не существует).

Хотя это может сработать для вас, я также согласен с другими, что это редко лучший (или единственный) способ сделать это. Несомненно, есть способ реорганизовать ваш код, чтобы это стало ненужным, но вы должны предоставить некоторую дополнительную информацию о предполагаемом использовании, откуда к этим данным осуществляется доступ или просто почему классам действительно нужно ссылаться на один объект.

[Edit]

Поскольку вы используете статический кеш, аналогичный синглтону, вам следует позаботиться о том, чтобы реализовать его правильно . Это означает несколько вещей:

  1. Ваш класс кеша должен иметь частный конструктор. Вы не хотите, чтобы кто-либо явно создавал новый экземпляр - это не вариант при использовании синглтонов. Это означает, что вы должны предоставить какое-то общедоступное статическое свойство, например Cache.Instance , которое всегда будет возвращать ссылку на тот же частный объект. Поскольку конструктор является частным, вы уверены, что только класс Cache может создать экземпляр во время инициализации (или первого обновления). Подробную информацию о реализации этого шаблона можно найти на http://www.yoda.arachsys.com/csharp/singleton.html (который также является отличной поточно-ориентированной реализацией).

  2. Когда все вы объект имеет тот же экземпляр, тогда вы можете просто уведомить кеш для обновления одного частного экземпляра (например, вызвать Cache.Update () откуда-то). Таким образом вы можете обновить единственный экземпляр, который используют все.

Но из вашего примера все еще не ясно, как именно вы уведомляете своих клиентов о том, что данные все равно были обновлены. Механизм, управляемый событиями, будет работать лучше, поскольку он позволит вам отделить ваш код - Синглтоны - это зло .

0
ответ дан 4 December 2019 в 13:04
поделиться

Что, если бы вы сделали это:

public class B
{
    B(int i) {A = new A(i);}
    public A A {get; set;}
}

...

void Main()
{
    B b1 = new B(1);
    A a2 = new A(2);
    b1.A = a2;
}

Во всей программе ссылки на A должны быть доступ через экземпляр B. Когда вы переназначаете bA, вы меняете ссылку на A, но это не имеет значения, потому что все ваши внешние ссылки по-прежнему указывают на B. Это имеет много общего с вашим исходным решением, но он позволяет вам изменять A любым способом, не обновляя его метод ValueAssign.

0
ответ дан 4 December 2019 в 13:04
поделиться