2010-12-09 2 views
1

모든 명시 적 유형을 자동으로 제거하고 큰 해결책의 var 키워드로 교환하려고합니다. 난 그냥 명시 적 유형을 사용하여 시작으로, 일관성있는 물건을 갖고 싶어,명시 적 유형을 var-keyword와 자동으로 교환하십시오.

var a = 1; 

이 그냥 화장품, 솔루션의 코드가 완벽하게 잘 작동입니다 : 대신

int a = 1; 

의 내가 갖고 싶어 , 나중에는 사용 된 var-keywords를 사용합니다.

필자가 일종의 코드 파서를 작성해야 할 것이라고 생각합니다. 약간 귀찮은 것 같습니다. 아무도 이것에 대한 쉬운 해결책을 알고 있습니까?

건배, 검색에 대해 무엇 크리스

+4

Personlly 필자는 타입이 'Dictionary >>'과 같이 길 때만 var를 사용합니다. 나는 그들이 같은 길이이기 때문에 int 대신에 그것을 결코 사용하지 않을 것이다. 그러나 그것은 단지 2 센트입니다. – juharr

+3

예를 들어주의하십시오 :'float a = 3;'var a = 3;'으로 변환하면 int가됩니다. –

+2

저는 그대로 두었습니다. var은 긴 클래스 이름과 물건을 로컬로 사용하는 데는 좋지만 int와 var 사이의 선택 인 경우 var는 명확하고 읽기 쉽지 않습니다 (읽기 쉽고 * 읽기 쉽지 않음). – Kendrick

답변

6

이것은 대답 그 자체가 아닙니다.이지만 댓글이 너무 길어요.

이 아니라고 생각하면이 좋습니다. 명시 적 및 추론 적 입력을 혼합하는 것에 대한 문체적인 우려는 없습니다 (익명 유형을 사용할 때나 코드를 읽기 쉽게 할 때 필요할 때 유형을 유추해야 함).이 문제로 인해 발생할 수있는 잠재적 인 문제가 많이 있습니다.

  • 선언은 할당하지 않고 그 의미를 바꿀 것 null에 할당 된 자격
  • 선언이 슈퍼의하지만 하위 유형 (또는 호환하지만 서로 다른 타입)의 인스턴스로 초기화 자격
  • 선언되어 있습니다 .

I.E. 물론

object foo = "test"; 

... 

foo = 2; 

이 단순한 (그리고 가능성) 예이지만, varobject에서 foo을 변경하면 (이 같으면 대신 objectstring로 입력되는 foo 될 것이며, 코드의 의미를 변경 것 이 경우에도 컴파일되지 않지만 과부하 해결을 변경하는 시나리오를 찾기가 더 어려울 수 있지만 이 컴파일 타임 오류를 생성하지 않습니다.

즉,하지 마세요.

+0

고마워, 이건 내게 완벽하게 합리적이라고. 내가 너의 충고를 할거야. – Christopher

-2

은/예를 들어 검색 VOR 'INT'비주얼 스튜디오 IDE 에 교체하고 'VAR'로 교체하십시오.

+1

-1 나는 StingyJack의 대답에 대한 논평과 같은 이유로. – cdhowie

+0

@cdhowie - 아무도 글로벌 대체를 말하는 것은 아닙니다. 아마도 합법적 인 해결책이 될 때 "도움이되지 않는다"고 가정하고 선언해야합니다. – StingyJack

+2

@StingyJack : 아마도 기본적으로 C# 파서가 필요하므로 어쨌든 원래 질문을 다시 읽어야합니다. 아마도 100 가지가 넘는 다른 유형을 사용하여 전체 솔루션에서 찾기/바꾸기는 간단하지 않을 수 있습니다. mturk이 당신을 위해 그것을하고 싶지 않다면 ... – cdhowie

0

Look into Lex & Yacc. 이를 perl이나 awk 스크립트와 결합하여 소스를 기계적으로 편집 할 수 있습니다.

CEDET를 사용하여 emacs에서도이 작업을 수행 할 수 있습니다. 코드 모듈을 구문 분석하고 코드 분석 테이블을 생성합니다.

두 경우 모두 ... 클래스 선언 (클래스 이름, 부모 유형, 시작 및 종료 지점), 메소드 선언 (유사), 변수 선언 등을 설명하는 코드를 작성해야합니다. 에.그런 다음 테이블을 걷는 코드 (perl, awk, powershell, elisp 등)를 작성하고 적절한 각 변수 선언에 대한 대체 코드를 작성합니다.

+0

또는 Mono 프로젝트에서 gmcs 및/또는 gmcs 문법을 빌려 컴파일러를 조정하여 소스를 생성하고 (1) 문법적으로 합법적 일 때 로컬 변수 선언 유형을 'var'로 바꾸고, (2) 가능한 경우 'var'을 사용하는 것이 변수의 타입을 변경하지 않는다는 것을 증명해야합니다. – cdhowie

+0

예, 그게 좋은 생각입니다. 내가 생각하기에, lexer/analyzer 부분에는 몇 가지 옵션이 있습니다. – Cheeso

0

자동화 된 방식으로이 작업을 수행 할 때주의해야합니다. 실제로 프로그램의 의미를 변경하거나 오류를 초래할 수있는 곳이 있습니다. 예를 들어,

IEnumerable<string> list = MethodThatReturnsListType(); 

또는이 이후

string foo = null; 
if (!dict.TryGetValue("bar", out foo)) 
{ 
     foo = "default"; 
} 

당신이 다른 이유에 대한 코드를 만지지 나는 단순히 그들을 대체 할 것이다, 오류가 없습니다. 그렇게하면 주변 코드를 검사하고 의미를 변경하지 않고 수정해야하는 오류가 발생하지 않도록 할 수 있습니다.

1

첫째, 이것은 아마도 좋은 생각이 아닙니다. var에는 이점이 없습니다. int 이상; 많은 선언은 거의 간단합니다.

그러나 당신이해야하는 경우

...

부분적으로 수동 솔루션은 경고로 ReSharper에서의 "사용 var에"힌트를 설정하고 그들 모두를 해결하기 위해 얻을 수 있습니다. ReSharper에서이 한꺼번에 엉 그것을 할 것입니다 나도 몰라,하지만 난 + PgDn을Alt 키의 빠른 순서에 타사 코드의이 나쁜 일 조각을 통해 자주 소총, Alt 키 + 를 입력 .

이것은 ReSharper가 코드의 의미를 존중한다는 중요한 장점이 있습니다. 타입을 무차별로 대체하지는 않을 것이고, 프로그램의 의미에 영향을주지 않는 변경 만 할 것이라고 확신합니다. 예 : object o = "hello";을 대체하지는 않습니다 (이 문제를 확인하기 위해 VS 앞에 있지는 않습니다).

관련 문제