2014-03-25 5 views
0

나는 이것이 꽤 명백한 질문이라는 것을 알고있다. 그러나 내가 본 것에서 나는 그것을 얻을 수 없다.C#에서 get 및 set을 사용하려면 어떻게해야합니까?

나는 정확히 어떻게 게터을 이해하지 않고 세터는 예를 들면, 나는 내가 대학하도록되어있어 게임의 캐릭터에 대한이 코드가, C#으로 작업 :로 지금

namespace Clase_25_3_2014 
{ 
    class Brick 
    { 
     private int speed { get; set; } 
     private Vector2 pos { get; set; } 
     private Texture2D skin { get; set; } 

     public Brick(int speed, Vector2 position, Texture2D skin) 
     { 
      this.Speed(speed); 
      this.Pos(position); 
      this.Skin(skin); 
     } 

    } 
} 

Brick brick = new Brick(1, Vector2.Zero, mySkin); 
brick.GetPos(); 

자, 분명히 그 너희들에 대한 이상한보고, 나는 아직 발견되지 않았기 때문에 그게 내가 그것을 사용하는 하죠 방법은 다음과 같습니다 내가이 클래스를 사용 어디 같이 호출하려고 서 올바르게 그것이 brick.getPos()처럼 작동하도록; 자바에서.

정말로 분명한 질문을 드려 죄송합니다. 그러나 저에게 답을 찾을 수없는 것 같습니다.

+0

http : // stackoverflow.com/questions/614818/what-of-the-the-public-private-protected-and-nothing – jdphenix

+0

단순히'var pos = brick.pos;'또는'brick.pos = something;'- BTW, 만약 당신이 C#으로 작업하면 C#의 명명 규칙을 존중해야합니다. 프로퍼티에'ProperCase'를 사용하고 의미있는 이름을 부여하십시오 (''pos "'는 아무 의미도 없으며,'Position' 등). BTW, [java sucks] (http://whyjavasucks.com/) 동안 [C# rocks] (http://www.slideshare.net/jeffz/why-java-sucks-home.html) 때문에 이러한 기능 중 하나가 없습니다. and-c-rocks-final) –

+0

예 C#이 Java보다 더 시원하다는 느낌이 들기 때문에 C#의 변수에도 ProperCase를 사용합니까? 따라서 변수는 대문자로 시작됩니까? – krieg

답변

4

. pos를 public으로 설정하면 Brick.pos를 사용하여 설정하고 Brick.pos (위치)를 사용하여 설정할 수 있습니다. 클래스 액세스

namespace Clase_25_3_2014 
{ 
    class Brick 
    { 
     public Brick(int speed, Vector2 position, Texture2D skin) 
     { 
      this.Speed = speed; 
      this.Pos = position; 
      this.Skin = skin; 
     } 

     public int Speed { get; set; } 
     public Vector2 Pos { get; set; } 
     public Texture2D Skin { get; set; } 
    } 
} 

유형 :

// lots of explicity (is that a word? :) 
public MyClass 
{ 
    // Field 
    // It is recommended to never expose these as public 
    private int _myField; 

    // Property (old school, non-auto private field) 
    public int MyProperty 
    { 
    public get 
    { 
     return this._myField; 
    } 
    public set 
    { 
     this._myField = value; 
    } 
    } 

    // Property (new school, auto private field) 
    // (auto field cannot be accessed in any way) 
    public int MyProperty2 { public get; private set; } 

    // Method (these are not needed to get/set values for fields/properties. 
    public int GetMyMethod() 
    { 
    return this._myField; 
    } 
} 


var myClass = new MyClass; 

// this will not compile, 
// access modifier says private 
// Set Field value 
myClass._myField = 1; 

// Get Property Value 
var a = myClass.MyProperty; 

// Set Property Value 
myClass.MyProperty = 2; 

// Get Property Value 
var b = myClass.MyProperty2; 

// this will not compile 
// access modifier says private 
// Set Property Value 
myClass.MyProperty2 = 3; 

// Call method that returns value 
var c = myClass.GetMyMethod(); 
+0

그래, Get과 Set은 어디서 왔습니까? Get과 Set을 강제로 개인화했거나 C#에서 다르게 작동합니까? – krieg

+1

나는 * 작업이 다르게 해석된다는 것을 이해하지 못합니다. 당신은 어떤 다른 맥락을 부여하지 않았습니다. 또한 [Access Modifiers] (http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx)와 [필드 및 속성 간의 차이점] (http://stackoverflow.com/questions/)을 혼동하지 마십시오. 653536/속성과 필드의 차이점 -c-sharp-3-0) –

+4

@Krieg, JD41의 게시물에 추가하려면 클래스 외부의 코드가 속성을 설정할 수 있는지 여부를 고려할 수 있습니다. 그렇지 않다면'{get; private set;}'당신의 속성을위한 접근 수정 자. 생성자는 값을 설정할 수 있지만 클래스 외부의 코드는 해당 값을 읽을 수만 있습니다 (물론 필요한 경우). –

0

당신은 다만해야 pos가 개인 인 경우 "GetPos"라는 방법이 없기 때문에 당신은 GetPos 할 수 없습니다

Brick brick = new Brick(1, Vector2.Zero, mySkin); 
Vector2 vec = brick.pos; 
+0

그래, 그게 세터로 일하는거야? 나도 몰라, 수업을 나가서 사용하지 않는 것이 이상하게 느껴진다. – krieg

+0

그것은 정확하게 set/get과 똑같이 작동합니다. C#에서 수행되는 방법입니다. – omriman12

2

이로 변경 시도 :

public Brick(int speed, Vector2 position, Texture2D skin) 
    { 
     this.Speed = speed; 
     this.Pos = position; 
     this.Skin = skin; 
    } 

및 C#과 그렇지 여기

는이 클래스를 쓸 수있는 방법 이 유형의 생성자가 필요합니다. 당신은 다음과 같은 방법으로 생성자없이 클래스의 객체를 선언 할 수

public Brick brickTest(){ 
    Speed = 10, 
    Position = new Vector2(), 
    Skin = new Texture2D() 
}; 
1
namespace Clase_25_3_2014 
{ 
    class Brick 
    { 
     public int Speed { get; set; } 
     public Vector2 Pos { get; set; } 
     public Texture2D Skin { get; set; } 

     public Brick(int speed, Vector2 position, Texture2D skin) 
     { 
      this.Speed = speed; 
      this.Pos = position; 
      this.Skin = skin; 
     } 

    } 
} 

외부 사용 :

Brick brick = new Brick(1, Vector2.Zero, mySkin); 
Console.WriteLine(Brick.Pos); 

그러나, 컴파일러는 각 속성에 대한 만들 배후 :

  • 속성 유형의 개인 변수 저장.
  • 두 가지 기능 (Get \ Set).
  • 사용 된 속성을 함수로 변환합니다.
+0

이것은 컴파일하지 않습니다 (왜냐하면 당신은 대문자이고 Brick은 Pos라는 정적 필드 나 속성을 가지고 있지 않기 때문입니다). –

+0

감사합니다. 편집했습니다. – dovid

2

C#에서 자동 속성을 선언하면 get 및 set 메서드로 뒤에서 컴파일되지만 생각할 필요는 없습니다. 필드 인 것처럼 속성에 액세스 할 수 있습니다.

속성을 갖는 이점은 getter 및/또는 setter에서 사용자 지정 논리를 제공 할 수 있도록 뒷전 필드가있는보다 전통적인 속성의 속성을 쉽게 바꿀 수 있다는 것입니다. 그러나 필요할 때까지는 여분의 소음 일뿐입니다. auto-property는 소음을 피하기 위해 문법적 설탕을 제공합니다.

Brick brick = new Brick(1, Vector2.Zero, mySkin); 
Vector2 oldPos = brick.pos; 
brick.pos = new Vector2.One; 
관련 문제