属性 (コンピューティング)

計算機科学において、**属性**（ぞくせい、）または**アトリビュート**とはオブジェクト、要素、またはファイルのプロパティを定義する仕様のことである。また、これらの所与のインスタンスについて、属性によって特定の値の参照または設定ができる。

より正確には、属性はメタデータと見なすべきである。しかし実際の利用において、議論の対象となっているテクノロジーによってはプロパティの同義語として扱われることがあり、実際にそう扱われることが多い。

命名された属性には、オペレーションと呼ばれるルールセットが関連付けられる。文字が合計されたり整数の配列が画像オブジェクトとして操作、処理されたりすることはない。また、テキストが浮動小数点として処理されることもない。
従って、オブジェクト定義はデータ型付けを課すことで拡張できる。

表示形式、既定値、正当なオペレーション (ルール) と制約 (「ゼロ除算は許容されない」) は、すべて属性の定義と潜在的に関係しており、あるいは逆に、そのオブジェクトの型の属性として説明できる。
JPEGファイルはPNGと同じオペレーションでデコードされることはないし、浮動小数点数は型付けされたlong整数に適用されるルールに基づいて操作されることはない。

たとえばコンピュータグラフィックにおいては、線オブジェクトは太さ (実数値)、色 (茶や緑といった説明的な値、またはRGB等の色モデルで定義される値)、破線、等の属性を持ち得る。円オブジェクトは、同様の属性に加えて円と半径で定義することができる。

## アトリビュートの使用方法

### C#
C#プログラミング言語では、属性はフィールドあるいはアセンブリ、メンバー、そして型といったコードブロックに付属するメタデータであり、Javaのアノテーションに相当する。属性はコンパイラからも、リフレクションによってプログラムからもアクセスできる。

C#では、横断的な問題や仕組みまたはプラットフォームのその他の用途に対応するために属性が使用されている例が多く見られる。このせいで、これが意図された唯一の使用目的であるという誤った印象が生まれている。属性でabstract、sealed、またはpublic等の属性を拡張できる。

メタデータとしての属性の具体的な用途は開発者に委ねられており、任意のアプリケーション、クラス、そしてメンバーに関するインスタンス固有でない幅広い情報を網羅することができる。任意の属性をプロパティとして公開するかどうかは、属性をより大きなアプリケーションフレームワークの一部として使うかどうかという決定と同様、開発者に委ねられている。

属性はSystem.Attributeから派生したクラスとして実装される。COMとの相互運用、遠隔手続き呼出し (RPC)、シリアル化といったCLRサービスによって使用されることが多く、また、実行時に問い合わせることができる。

この例はC#での属性定義のやり方を示すものである。
```csharp
[Obsolete("Use class C1 instead", IsError = true)]  // Cが廃止である旨の
public class C {...}                                // コンパイラーメッセージが表示される

public class ObsoleteAttribute: Attribute {         // このクラス名は末尾に "Attribute" が含まれるが
  public string Message{ get; }                     // "Obsolete" だけで使用できる
  public bool IsError{ get; set; }
  public ObsoleteAttribute() {...}
  public ObsoleteAttribute(string msg) {...}
  public ObsoleteAttribute(string msg, bool error) {...}}

[Obsolete]
[Obsolete("This is obsolete")]
[Obsolete("This is obsolete", false)]
[Obsolete("This is obsolete", IsError = false)]
```
上記の最初の文字列型のパラメーターのような位置指定パラメーターは、属性のコンストラクターのパラメーターである。この例のブール値のパラメーターのような名前付きパラメーターは属性のプロパティであり、定数値でなければならない。

属性はXML文書と比較対照したい。XML文書においては、メタデータは定義されるがコンパイル済みアセンブリには含まれないためにプログラム的にアクセスすることができない。

### 例
checked属性とチェックボックスのプロパティの変化を表示する。

```html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>attr demo</title>
  <style>
  p {
    margin: 20px 0 0;
  }
  b {
    color: blue;
  }
  </style>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
 
<input id="check1" type="checkbox" checked="checked">
<label for="check1">Check me</label>
<p></p>
 
<script>
$( "input" )
  .change(function() {
    var $input = $( this );
    $( "p" ).html( ".attr( 'checked' ): <b>" + $input.attr( "checked" ) + "</b><br>" +
      ".prop( 'checked' ): <b>" + $input.prop( "checked" ) + "</b><br>" +
      ".is( ':checked' ): <b>" + $input.is( ":checked" ) + "</b>" );
  })
  .change();
</script>
</body>
</html>
```


#### クリックする前

```javascript
.attr( 'checked' ): checked
.prop( 'checked' ): false
.is( ':checked' ):  false
```


#### クリックした後

```javascript
.attr( 'checked' ):   checked
.prop( 'checked' ):    true
.is( ':checked' ):     true
```


### マルチバリューデータベース
脱リレーショナルまたはマルチバリューのデータベースシステムの多くは、SQLと比べると、テーブルはファイル、行はアイテム、列は属性となっている。データベースとコードの両方において、属性はバリューとサブバリューをさらに含めるよう定義できるものの、プロパティおよび変数と同意である。

こうしたデータベースの元祖はPickオペレーティングシステムであった。現在のプラットフォームには、たとえばRocket U2のUniverseとInterSystemsのCachéの2つがある。

### XML
XMLにおいては、**属性**は開始タグまたは空要素タグ内に存在する名前と値の組を構成するマークアップである。HTMLやXML等のマークアップ言語では、データやデータフォーマットの記述に属性が使われる。

好例は値をプロパティ (要素) に代入するXML処理である。ただし、要素の値は要素自体の中ではなく、(別個の) 終了タグより前に来る。要素自体は多数の属性セット (`NAME = "IAMAPROPERTY"`) を持つ場合がある。

問題の要素が別の要素 (たとえば `CUSTOMER`) のプロパティ (`CUSTOMER_NAME`) だと考えられる場合、その要素は独自の属性 (プロパティ) を0個以上持つことができる (`CUSTOMER_NAME` は `TYPE = "KINDOFTEXT"` 型である)。

## 関連項目
* 属性と値の組
* HTML属性
* ファイル属性
* 拡張ファイル属性
* フィールド (計算機科学)
* プロパティ
* Javaアノテーション
* メタデータ

## 出典