�@

�A�ځFC# 3.0����

��2��@�����_���ƌ^���_

������Ѓs�[�f�[�@�얓 ��
2008/05/16
Page1 Page2 Page3

�@�O���ł̓����_���ɂ‚��ĉ���������A���Ⴊ����������������₷���Ǝv���̂ŁA�{���ɐ旧���āA�ŋߎ��ۂɕM�҂������������_�����g�p�����R�[�h�̎�����Љ�悤�B

�����_�����g�p��������

�@����́A�Q�[���Ȃǂł悭�g����u�t���O�v�ƌĂ΂��@�\�̃\�[�X�E�R�[�h�̎����P�i�‚܂�̓��t�@�N�^�����O�j���s���ۂɑ̌��������Ƃł���B�����ł����t���O�Ƃ́A�����񂩂�Ȃ閼�O�Ƃ���Ɋ֘A�t����ꂽ�����̏W�܂�ł���B

�@�Ȃ��A�ȉ��ɏЉ��\�[�X�E�R�[�h�͕�����₷����D�悵�Ċ�{�@�\�ȊO���������A�኱�̏C���������Ă��邱�Ƃ����f�肵�Ă����i�‚܂�A���ۂɃ`�F�b�N�C�������R�[�h�Ɠ����ł͂Ȃ��j�B

�@���āA�P�ɕ�������L�[�ɐ�����ۊǂ��邾���Ȃ�A�N�ł��v���t���Ƃ���A�ȉ��̂悤�Ȏ����ł悢�B

private static Dictionary<string, int> flags
                               = new Dictionary<string, int>();

�@�������A���̂܂܂̃R���N�V���������R�ɐG�点��͍̂D�܂������Ƃł͂Ȃ��̂ŁA�t���O�̒l��ݒ�^�擾����GetFlag�^SetFlag���\�b�h���ȉ��̂Ƃ���쐬�����B

public static void ValidateFlagName(string name)
{
  // ���O�̑Ó����`�F�b�N
  // ���������O�Ȃ牽������return����
  throw new ApplicationException(
      name + "��valid��flag�̖��O�ł͂���܂���B");
}

public static int GetFlag(string name)
{
  ValidateFlagName(name);
  int result = 0;
  flags.TryGetValue(name, out result);
  return result;
}

public static void SetFlag(string name, int newValue)
{
  ValidateFlagName(name);
  flags[name] = newValue;
}
���X�g1 Dictionary�Ńt���O�p���\�b�h

�@���Ȃ݂ɁA�u�o�^����Ă��Ȃ��t���O���ɑ΂��Ă�0��Ԃ��v�u��������O�ŏ������i�s���邱�Ƃ͍D�܂����Ȃ��̂ŁA�K���t���O�����`�F�b�N����v�Ƃ���2�‚̏�����t�����Ă���BValidateFlagName���\�b�h�́A�t���O�����`�F�b�N���Ė���`�̖��O�ł͂Ȃ��ꍇ�͗�O�𓊂���B

�@���āA���̃R�[�h�͏\���ɃV���v���ł��邪�A�\�[�X�E�R�[�h�̑̎����P��Ƃɒ��肵�����_�Ŏ���2�‚̖�肪�����яオ�����B

  • �t���O���̃`�F�b�N�����s���܂Œx�������ƃo�O�������ɔ����ł��Ȃ��B�R���p�C�����Ƀt���O�����`�F�b�N�ł��Ȃ����낤���H

  • �v���t�@�C���ɂ������Ƃ���AValidateFlagName���\�b�h�̏������x�����Ƃ����������B���̂��ߎ����e�X�g�Ɏ��Ԃ������肷���Ă��ăe�X�g�� ���s�p�x�������Ă���B�i�����P�̂��߂Ɏ����e�X�g��������������

�@���āA���̖�����������ɂ͂ǂ�������悢���낤���B

�@�ŏ��ɍl���������ẮA�t���O�����t�B�[���h���ɒu���������ȉ��̂悤�ȃN���X���쐬���邱�Ƃł������B�t�B�[���h�𒼐ځA���������Ž��R�ɊO�����瑀��”\�ɂ��邱�Ƃ��C���������Ǝv���ǎ҂�����Ǝv�����A���Ƃ��Ƃ����ň����t���O�̓v���O�������̔C�ӂ̌����玩�R�ɓǂݏ������������̂Ȃ̂ŁA�@�\�I�ɂ͗v���Ǝ����͍��v����i����ɂ����΁A�����͕K�v������΃v���p�e�B�ɒu���”\�ł���A���ۂ̎����ł͈ꕔ���v���p�e�B�Ƃ��Ď�������Ă���j�B

public static class Flags
{
  public static int �N����;
  public static int �Љ�]��;
  public static int ������;
  �c�c
}
���X�g2 �t�B�[���h�Ńt���O

�@����ŁA�u�������t���O�����g�p���Ă��邱�Ƃ��R���p�C�����Ɍ��؂����v�u�R���p�C�����ɖ��O�����؂����̂ŁA���s���ɏd��ValidateFlagName���\�b�h���ĂԕK�v���Ȃ��v�Ƃ���2�‚̐��ʂ𓾂���B���Ȃ݂ɁA�t���O�̓t�@�C���ɑ΂��ĕۑ��^�ǂݍ��݂̋@�\�����•K�v�����邪�A����̓N���X�̃V���A���C�Y�ƍl����΁A�������b�ł͂Ȃ��B���t���N�V�����@�\���g���āA�t�B�[���h�̖��O�ƒl�̃y�A��ǂݎ��^�l���������ޏ������L�q����Ηe�ՂɎ����ł���B

�@�������A����Ńn�b�s�[�G���h�Ƃ͂Ȃ�Ȃ������B�ȉ��̂悤�Ȗ�肪�o������ł���B

  1. �A�v���P�[�V�����̓�lj������s����ƁA�t�B�[���h�����ύX����A�ύX���ꂽ���O����ɓ����Ƃ͌���Ȃ��B�‚܂�A�t�@�C���ɏ����o��������ǂݍ��ނƁA�����t���O�ɒl��ǂݍ��߂Ȃ��”\��������

  2. �t���O���𕶎��񏈗��Ő����������P�[�X������B�Ⴆ�΁A�u�@�\���{�ԍ��v���t���O���ɂȂ�P�[�X�ł́A�����񌋍��Ńt���O���𓾂�K�v������B���̂悤�ȃP�[�X�ł́A���������Ƀt���O��ǂݏ�������GetFlag(���O)�^SetFlag(���O, �l)�Ƃ������\�b�h��p�ӂ�����𓾂Ȃ�

�@1�̖��O�̖��͖{�؂ł͂Ȃ��̂ʼn�������y���������悤�B����͈ȉ��̂悤�ɁA�����Ŗ��O��Y���邱�Ƃʼn��������B�t���O���̌݊������Ӗ������‚̂̓v���O�����O���Ƃ̂��Ƃ肾���Ȃ̂ŁA�����Ŗ{���̖��O��Y���Ă����Ώ\���ł���B���Ȃ݂ɁA�����Ŗ��O��Y����Ƃ���������́AC#���t�B�[���h���ɋ����Ă��Ȃ��������g�����t���O���΍�Ƃ��Ă��L���ł���B

public class FlagNameAttribute : Attribute
{
  public readonly string Name;
  public FlagNameAttribute(string name)
  {
    Name = name;
  }
}

public static class Flags
{
  [FlagName("�N����")]
  public static int �N����;

  [FlagName("�Љ�]��")]
  public static int �Љ�]��;

  [FlagName("������")]
  public static int ������;
  �c�c
}
���X�g3 �����ɂ��t���O�����t�B�[���h�ɓY�t

�@���ď�L2�̖��ł��邪�A������Ńt���O�����󂯎���ăt�B�[���h��ǂݏ������邱�Ǝ��̂́A���t���N�V�������g���Γ���b�ł͂Ȃ��B�������A�v���t�@�C���Ŏ��ۂɑ��肵�Ă݂�ƁA���t���N�V�����͗\�z�ȏ�ɏd�������������B���̃\�[�X�E�R�[�h�̑̎����P�́u�����e�X�g�̍������v�Ƃ����e�[�}���f���Ă���̂ŁA���x���x��������NG�ł���B

�@��̓I�Ƀ��t���N�V�����̉����x���̂��Ƃ����ƁA���O��^���ĖړI�̃t�B�[���h��T���o�������ł���B�Ȃ�΁A�������̖��O�̃t�B�[���h��ǂݏ������郉���_�������s�J�n���_�ŗp�ӂ��Ă����A���O�ɂ�����t���O���ƌ��ѕt���Ă����Αf�����t���O��ǂݏ����ł��邱�ƂɂȂ�B

�@���ۂɁA���̈Ӑ}�����������̂��ȉ��̃N���X�ł���B

public static class FlagsList
{
  // �t���O�̃Z�b�^�[�ƂȂ�f���Q�[�g
  private delegate void FlagSetter(int val);

  // �t���O�̃Q�b�^�[�ƂȂ�f���Q�[�g
  private delegate int FlagGetter();

  // �t���O���ƃZ�b�^�[�����ѕt����}�b�v
  private static Dictionary<string, FlagSetter> setterMap
                    = new Dictionary<string, FlagSetter>();

  // �t���O���ƃQ�b�^�[�����ѕt����}�b�v
  private static Dictionary<string, FlagGetter> getterMap
                    = new Dictionary<string, FlagGetter>();

  public static int GetFlag(string name)
  {
    FlagGetter getter;

    if (getterMap.TryGetValue(name, out getter)) return getter();

    throw new ApplicationException(
        name + "��valid��flag�̖��O�ł͂���܂���B");
  }

  public static void SetFlag(string name, int val)
  {
    FlagSetter setter;
    if (setterMap.TryGetValue(name, out setter))
    {
      setter(val);
      return;
    }
    throw new ApplicationException(
        name + "��valid��flag�̖��O�ł͂���܂���B");
  }

  static FlagsList() // �R���X�g���N�^
  {
    foreach (FieldInfo info0 in typeof(Flags).GetFields(
                     BindingFlags.Public | BindingFlags.Static))
    {
      // �����_���ɕʌ‚ɃL���v�`�������邽�߁A
      // �����Ő錾����info�ɃR�s�[����
      FieldInfo info = info0;

      // �t�B�[���h���ɕt��������������t���O�����擾���A
      // �Q�b�^�[�ƃZ�b�^�[�̃}�b�v���쐬
      FlagNameAttribute[] names
        = (FlagNameAttribute[])info.GetCustomAttributes(
                              typeof(FlagNameAttribute), false);

      if (names.Length > 0)
      {
        string name = names[0].Name;
        getterMap.Add(name, () => (int)info.GetValue(null));
        setterMap.Add(name, (val) => info.SetValue(null, val));
      }
    }
  }
}
���X�g4 �}�b�v�ɂ��t�B�[���h�ƃ����_�����֘A�t����FlagsList�N���X

�@�����Ƃ����ϓ_���炢���΁A���炭�����_�����g�킸�A�t���O���ƕϐ�info�̒l���֘A�t����}�b�v��1�쐬���邾���ł��\�����낤�B���̕�������������ʂ����Ȃ��B�������A���ۂɂ̓Q�b�^�[�i�ǂݏo���j�ƃZ�b�^�[�i�������݁j��2�‚̃}�b�v���쐬���Ă���B���̃R�[�h�̐^���́A�t���O�̌^�̃o���G�[�V�����𑝂₵�����_�Ŕ��������B

�@�Ⴆ�΁A0��1�������蓾�Ȃ��t���O��int�^����bool�^�ŕ\����������悢�Ƃ��āA�ȉ��̂悤�ȃt�B�[���h���������Ƃɂ����Ƃ��悤�B

[FlagName("������������")]
public static bool ������������;

�@����ɑΏ����āAFlagsList�N���X�̃R���X�g���N�^�͈ȉ��̂悤�ɏC���ł���B�Ȃ��AGetValue�^SetValue���\�b�h�̓t�B�[���h�̒l��ǂݏ������邽�߂�FieldInfo�N���X�̃��\�b�h�ł���B

getterMap.Add(name, () => (int)info.GetValue(null));
setterMap.Add(name, (val) => info.SetValue(null, val));

if (info.FieldType == typeof(bool))
{
  getterMap.Add(name,
          () => (bool)info.GetValue(null) ? 1 : 0);
  setterMap.Add(name,
          (val) => info.SetValue(null, val == 0 ? false : true));
}
else
{
  getterMap.Add(name, () => (int)info.GetValue(null));
  setterMap.Add(name, (val) => info.SetValue(null, val));
}

�@����ɂ��AGetFlag�^SetFlag���\�b�h�o�R�̃A�N�Z�X�͏]���ǂ���int�^�̒l�ōs�����A�t�B�[���h�ɒ��ڃA�N�Z�X����ꍇ��false�^true�œǂݏ����ł���悤�ɂȂ����B

�@�����A�t���O���ƕϐ�info�̒l���֘A�t����}�b�v���쐬���Ă���Ƃ���΁AGetFlag���\�b�h�̎������e�͈ȉ��̂悤�ɂȂ邾�낤�i�����j�B

FieldInfo info;

if (fieldInfoMap.TryGetValue(name, out info))
{
  if (info.FieldType == typeof(bool))
  {
    return (bool)info.GetValue(null) ? 1 : 0;
  }
  else
  {
    return (int)info.GetValue(null);
  }
}
���X�g5 GetFlag���\�b�h�̓��e�i�t���O���ƕϐ�info���֘A�t�����ꍇ�j

�@�������A�t���O���ƃ����_�����֘A�t�����}�b�v���쐬���Ă���Έȉ��̓��e�ł悢�i�����j�B

FlagGetter getter;
if (getterMap.TryGetValue(name, out getter)) return getter();
���X�g6 GetFlag���\�b�h�̓��e�i�t���O���ƃ����_�����֘A�t�����ꍇ�j

�@���҂̍��́A�^�̔���Ƃ���ɔ����ꍇ���������s����^�C�~���O�ɂ���B�O�҂́A����Əꍇ������GetFlag�^SetFlag���\�b�h���Ă΂�邲�ƂɎ��s���邪�A��҂̓R���X�g���N�^��1����s���邾���ł���B

�@���̍��́AGetFlag�^SetFlag���\�b�h�̎��s�񐔂�������Α��x���ƂȂ�B���ۂɗ��҂̃R�[�h�������e�X�g�Ŕ�r�������A��҂̕����킸���ɑ������ʂɂȂ����i�����܂ŕM�҂��J�����̃v���O�����ł̌��ʂȂ̂ŁA�ʂ̃v���O�����ł��������ʂɂȂ�Ƃ͌���Ȃ����j�B���̒��x�ł���΂܂�����قǑ傫�ȍ��ł͂Ȃ����A���̂悤�Ȕ���Əꍇ�����̎�ނ�������΁A���̍��͍L�����Ă������낤�B�t�ɂ����΁A�\�[�X�E�R�[�h�̑̎����P��i�߁A���x���]���ɂ����ɔ���Əꍇ�����𑝂₷���R�𓾂邽�߂ɁA���̂悤�ȃR�[�h�͗L�����Ƃ�����B���ꂪ�A�����_���𐮐��╶����Ɠ����悤�ɁA�����̂��Ƃ��g���v���O���~���O�������炵�����ʂł���B

�@�������A���̂悤�ȃR�[�h����ɗD��Ă���A�őP�ł���A���̂悤�ȃR�[�h�������ׂ��ł���A�M�҂͐�������A�Ƃ��������킯�ł͂Ȃ��B����́A���܂��ܕM�҂��������R�[�h�̈��ɂ����Ȃ��B�őP�ł͂Ȃ���������Ȃ����A��ɂ悢���ʂ��o���Ƃ͌���Ȃ��B�������AC# 3.0�ł͂��蓾��I������1�‚ɓ������̂��낤�c�c�Ǝv���̂ł���B


�@INDEX
�@ C# 3.0����
�@ ��2��@�����_���ƌ^���_
  1�D�����_�����g�p��������
�@   2�D�g��������̃f���Q�[�g�^�W�F�l���b�N�E���\�b�h�ƌ^���_
�@   3�D�I�[�o�[���[�h�̉����^�������\�b�h�ƃ����_���̈Ⴂ�Ǝ��c���[

CfbNXEy[Ww �@�uC# 3.0����v


Insider.NET �t�H�[���� �V���L��
  • ��2��@�Ȍ��ȃR�[�f�B���O�̂��߂� �i2017/7/26�j
    �@�����_���ŋL�q�ł��郁���o�̑����Athrow���Aout�ϐ��A�^�v���ȂǁAC# 7�ɂ͈ȑO�����R�[�h���Ȍ��ɋL�q�ł���悤�ȋ@�\����������Ă���
  • ��1��@Visual Studio Code�f�o�b�O�̊�b�m�� �i2017/7/21�j
    �@Node.js�v���O�������f�o�b�O���Ȃ���AVisual Studio Code�ɓ�������Ă���f�o�b�O�@�\�̊�{�́u�L�v���}�X�^�[���悤
  • ��1��@���ĂȃR�[�f�B���O�̂��߂� �i2017/7/19�j
    �@C# 7�Œlj����ꂽ�V�@�\�̒�����A�u���l���e�����\���̉��P�v�Ɓu���[�J���֐��v���Љ��B�����͕�����₷���R�[�h���L�q����̂Ɏg����
  • Presentation Translator �i2017/7/18�j
    �@Presentation Translator��PowerPoint�p�̃A�h�C���B�v���[���e�[�V�������̎����̕t����A������ł̎��^�����A�X���C�h�̖|����s����
��IT���[���}�K�W���@�V������X�^�b�t�̃R���������[���œ͂��܂��i�����j

���ڂ̃e�[�}

Insider.NET �L�������L���O

�{�� ����