Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?
아주 좋은 기능들이 많아요, Reshapper/Rider.자주 사용하는 유닛 개발자도 많죠?
이러한 Reshapper/Rider 기능 중 하나인 "Code Inspections"코드가 안 좋은 부분을 지적하거나'이렇게 하면 더 좋을 것'이라고 수정할 수도 있다.
그렇다면 유니티 고유의'코드 인스피션'은 배경 지식이 필요하고 이해하기 어려운 것들이 있다.바로
「Possible unintended bypass of lifetime check of underlying Unity engine object」
네.
라이더에서는 이런 느낌으로 나온다.
이 투고는 그 배경과 내용을 소개한다.
배경 지식1
GameObject와 Component를 null과 비교할 때 함정이 있습니다.[SerializeField] private GameObject target; // 参照している。nullじゃない。
private void Awake()
{
Debug.Log(target == null); // Falseと表示される
DestroyImmediate(target);
Debug.Log(target == null); // Trueと表示される
}
위 코드에서 변수 target이 인용한 대상은 비어 있지 않지만 target == null
는 사실입니다.
GameObject와 Component의 부모급 Unity EngineObject에서 = 또는bool의 조작자를 정의했습니다.
또한 "대상의 게임Object와 Component가 살아남지 못하면 ==null과 비교하면 진실로 되돌아온다"는 행위다.
관련 기사: "GameObject와 Component를 null과 비교할 때의 함정"
배경 지식2
C#의 "person 오류:. Name"및 "person=null 오류: person. Name"은 서로 다릅니다.
null 조건 연산자에서 공백에 비해 "=="작업자는 비교하지 않습니다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
유사하게null 합병 산수그러나 마찬가지로 공백과 비교하면'=='조작원의 비교를 하지 않는다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
관련 기사: "C#의 경우 "person 오류:. Name"과 "person=null 오류: person. Name"은 서로 다릅니다."
배경지식1과 배경지식2가 결합된 주의사항
다음 코드 1 및// コード1
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target == null ? null : target.name); // `Null`と表示される
}
다음 코드 2는// コード2
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target?.name); // `UnassignedReferenceException`が投げられる
}
결과가 다르다.
코드 1에서 = 조작원을 사용했기 때문에 target
살아있다(DestroyImmediate로 파괴), target == null
진짜가 되고 로그에 표시된다Null
.
코드2는null조건연산자?.
를 사용하기 때문에 ==
라고 부르지 않습니다.코드 2의 처리는 대상의 생존과 무관하다.그 결과 처리가 진행되고 대상이 파괴되었다UnassignedReferenceException
.
ReShapper/Ride의 Code Inspection이란 무엇입니까?
배경지식1과 배경지식2가 결합된 주의사항
ReShapper/Rider의 Code Inspection의
「Possible unintended bypass of lifetime check of underlying Unity engine object」
뜻, 이유, 장점을 전달했나요?
게임Object와 Component를 null과 비교==
할 때 주기가 더해진 처리가 진행된다.한편,null조건연산자?.
와null합체연산자??
에는 생명주기가 추가되지 않습니다.언뜻 보기에는 같은 코드라도 다른 부분에 주의해야 한다.
자세한 건 이쪽도!
JetBrains/resharper-unity의wiki"Possible unintended bypass of lifetime check of underlying Unity engine object"
사견
나는 개인적으로 UnityEngine.Object
의 생존 상태==
와 !=
의 결과에 변화가 생길 것이라고 생각하는데 이것은 이해하기 어려운 방법이다...
Reference
이 문제에 관하여(Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RyotaMurohoshi/items/5821f4776f3599797c40
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[SerializeField] private GameObject target; // 参照している。nullじゃない。
private void Awake()
{
Debug.Log(target == null); // Falseと表示される
DestroyImmediate(target);
Debug.Log(target == null); // Trueと表示される
}
C#의 "person 오류:. Name"및 "person=null 오류: person. Name"은 서로 다릅니다.
null 조건 연산자에서 공백에 비해 "=="작업자는 비교하지 않습니다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
유사하게null 합병 산수그러나 마찬가지로 공백과 비교하면'=='조작원의 비교를 하지 않는다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
관련 기사: "C#의 경우 "person 오류:. Name"과 "person=null 오류: person. Name"은 서로 다릅니다."
배경지식1과 배경지식2가 결합된 주의사항
다음 코드 1 및// コード1
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target == null ? null : target.name); // `Null`と表示される
}
다음 코드 2는// コード2
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target?.name); // `UnassignedReferenceException`が投げられる
}
결과가 다르다.
코드 1에서 = 조작원을 사용했기 때문에 target
살아있다(DestroyImmediate로 파괴), target == null
진짜가 되고 로그에 표시된다Null
.
코드2는null조건연산자?.
를 사용하기 때문에 ==
라고 부르지 않습니다.코드 2의 처리는 대상의 생존과 무관하다.그 결과 처리가 진행되고 대상이 파괴되었다UnassignedReferenceException
.
ReShapper/Ride의 Code Inspection이란 무엇입니까?
배경지식1과 배경지식2가 결합된 주의사항
ReShapper/Rider의 Code Inspection의
「Possible unintended bypass of lifetime check of underlying Unity engine object」
뜻, 이유, 장점을 전달했나요?
게임Object와 Component를 null과 비교==
할 때 주기가 더해진 처리가 진행된다.한편,null조건연산자?.
와null합체연산자??
에는 생명주기가 추가되지 않습니다.언뜻 보기에는 같은 코드라도 다른 부분에 주의해야 한다.
자세한 건 이쪽도!
JetBrains/resharper-unity의wiki"Possible unintended bypass of lifetime check of underlying Unity engine object"
사견
나는 개인적으로 UnityEngine.Object
의 생존 상태==
와 !=
의 결과에 변화가 생길 것이라고 생각하는데 이것은 이해하기 어려운 방법이다...
Reference
이 문제에 관하여(Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RyotaMurohoshi/items/5821f4776f3599797c40
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// コード1
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target == null ? null : target.name); // `Null`と表示される
}
// コード2
[SerializeField] private GameObject target;
private void Awake()
{
DestroyImmediate(target);
Debug.Log(target?.name); // `UnassignedReferenceException`が投げられる
}
배경지식1과 배경지식2가 결합된 주의사항
ReShapper/Rider의 Code Inspection의
「Possible unintended bypass of lifetime check of underlying Unity engine object」
뜻, 이유, 장점을 전달했나요?
게임Object와 Component를 null과 비교
==
할 때 주기가 더해진 처리가 진행된다.한편,null조건연산자?.
와null합체연산자??
에는 생명주기가 추가되지 않습니다.언뜻 보기에는 같은 코드라도 다른 부분에 주의해야 한다.자세한 건 이쪽도!
JetBrains/resharper-unity의wiki"Possible unintended bypass of lifetime check of underlying Unity engine object"
사견
나는 개인적으로 UnityEngine.Object
의 생존 상태==
와 !=
의 결과에 변화가 생길 것이라고 생각하는데 이것은 이해하기 어려운 방법이다...
Reference
이 문제에 관하여(Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RyotaMurohoshi/items/5821f4776f3599797c40
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RyotaMurohoshi/items/5821f4776f3599797c40텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)